{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Pyro Dirichlet Process Mixture Model",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "TPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6oXxxX9LZL-h",
        "colab_type": "text"
      },
      "source": [
        "# **Dirichlet Process Mixture Models in Pyro**\n",
        "\n",
        "---\n",
        "\n",
        "## What are Bayesian nonparametric models?\n",
        "Bayesian nonparametric models are models where the number of parameters grow freely with the amount of data provided; thus, instead of training several models that vary in complexity and comparing them, one is able to design a model whose complexity grows as more data are observed. The prototypical example of Bayesian nonparametrics in practice is the *Dirichlet Process Mixture Model* (DPMM). A DPMM allows for a practitioner to build a mixture model when the number of distinct clusters in the geometric structure of their data is unknown – in other words, the number of clusters is allowed to grow as more data is observed. This feature makes the DPMM highly useful towards exploratory data analysis, where few facets of the data in question are known; this presentation aims to demonstrate this fact.\n",
        "\n",
        "## The Dirichlet Process (Ferguson, 1973)\n",
        "Dirichlet processes are a family of probability distributions over discrete probability distributions. Formally, the Dirichlet process (DP) is specified by some base probability distribution $G_0: \\Omega \\to \\mathbb{R}$ and a positive, real, scaling parameter commonly denoted as $\\alpha$. A sample $G$ from a Dirichlet process with parameters $G_0: \\Omega \\to \\mathbb{R}$ and $\\alpha$ is itself a distribution over $\\Omega$. For any disjoint partition $\\Omega_1, ..., \\Omega_k$ of $\\Omega$, and any sample $G \\sim DP(G_0, \\alpha)$, we have:\n",
        "\n",
        "$$(G(\\Omega_1), ..., G(\\Omega_k)) \\sim \\text{Dir}(\\alpha G_0(\\Omega_1), ..., \\alpha G_0(\\Omega_k))$$\n",
        "\n",
        "Essentially, this is taking a discrete partition of our sample space $\\Omega$ and subsequently constructing a discrete distribution over it using the base distribution $G_0$. While quite abstract in formulation, the Dirichlet process is very useful as a prior in various graphical models. This fact becomes easier to see in the following scheme.\n",
        "\n",
        "## The Chinese Restaurant Process (Aldous, 1985)\n",
        "\n",
        "Imagine a restaurant with infinite tables (indexed by the positive integers) that accepts customers one at a time. The $n$th customer chooses their seat according to the following probabilities:\n",
        "\n",
        "*   With probability $\\frac{n_t}{\\alpha + n - 1}$, sit at table $t$, where $n_t$ is the number of people at table $t$\n",
        "*   With probability $\\frac{\\alpha}{\\alpha + n - 1}$, sit at an empty table\n",
        "\n",
        "If we associate to each table $t$ a draw from a base distribution $G_0$ over $\\Omega$, and then associate unnormalized probability mass $n_t$ to that draw, the resulting distribution over $\\Omega$ is equivalent to a draw from a Dirichlet process $DP(G_0, \\alpha)$. \n",
        "\n",
        "Furthermore, we can easily extend this to define the generative process of a nonparametric mixture model: every table $t$ that has at least one customer seated is associated with a set of cluster parameters $\\theta_t$, which were themselves drawn from some base distribution $G_0$. For each new observation, first assign that observation to a table according to the above probabilities; then, that observation is drawn from the distribution parameterized by the cluster parameters for that table. If the observation was assigned to a new table, draw a new set of cluster parameters from $G_0$, and then draw the observation from the distribution parameterized by those cluster parameters.\n",
        "\n",
        "While this formulation of a Dirichlet process mixture model is intuitive, it is also very difficult to perform inference on in a probabilistic programming framework. This motivates an alternative formulation of DPMMs, which has empirically been shown to be more conducive to inference (e.g. Blei and Jordan, 2004).\n",
        "\n",
        "## The Stick-Breaking Method (Sethuraman, 1994)\n",
        "\n",
        "The generative process for the stick-breaking formulation of DPMMs proceeds as follows:\n",
        "\n",
        "* Draw $\\beta_i \\sim \\text{Beta}(1, \\alpha)$ for $i \\in \\mathbb{N}$\n",
        "* Draw $\\theta_i \\sim G_0$ for $i \\in \\mathbb{N}$\n",
        "* Construct the mixture weights $\\pi$ by taking $\\pi_i(\\beta_{1:\\infty}) = \\beta_i \\prod_{j<i} (1-\\beta_j)$\n",
        "\n",
        "* For each observation $n \\in \\{1, ..., N\\}$, draw $z_n \\sim \\pi(\\beta_{1:\\infty})$, and then draw $x_n \\sim f(\\theta_{z_n})$\n",
        "\n",
        "Here, the infinite nature of the Dirichlet process mixture model can more easily be seen. Furthermore, all $\\beta_i$ are independent, so it is far easier to perform inference in a probabilistic programming framework.\n",
        "\n",
        "First, we import all the modules we're going to need:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "VaAgD92IdE6i",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 400
        },
        "outputId": "47dd309c-4689-403e-900b-413381c4fedc"
      },
      "source": [
        "import torch\n",
        "from torch.distributions import constraints\n",
        "import torch.nn.functional as F\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.cm as cm\n",
        "from tqdm import tqdm\n",
        "\n",
        "from pyro.distributions import *\n",
        "import pyro\n",
        "from pyro.optim import Adam\n",
        "from pyro.infer import SVI, Trace_ELBO, Predictive\n",
        "assert pyro.__version__.startswith('1')\n",
        "pyro.enable_validation(True)       # can help with debugging\n",
        "pyro.set_rng_seed(0)"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting pyro-ppl\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/75/c8/3a52883ab27c5503385a983e4451a1e2944c2baab66c0f7ffc1f84bca329/pyro_ppl-1.1.0-py3-none-any.whl (429kB)\n",
            "\r\u001b[K     |▊                               | 10kB 15.8MB/s eta 0:00:01\r\u001b[K     |█▌                              | 20kB 2.1MB/s eta 0:00:01\r\u001b[K     |██▎                             | 30kB 3.1MB/s eta 0:00:01\r\u001b[K     |███                             | 40kB 2.1MB/s eta 0:00:01\r\u001b[K     |███▉                            | 51kB 2.6MB/s eta 0:00:01\r\u001b[K     |████▋                           | 61kB 3.1MB/s eta 0:00:01\r\u001b[K     |█████▍                          | 71kB 3.5MB/s eta 0:00:01\r\u001b[K     |██████                          | 81kB 4.0MB/s eta 0:00:01\r\u001b[K     |██████▉                         | 92kB 3.1MB/s eta 0:00:01\r\u001b[K     |███████▋                        | 102kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████▍                       | 112kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████▏                      | 122kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████                      | 133kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████▊                     | 143kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████▌                    | 153kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████▏                   | 163kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████                   | 174kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████▊                  | 184kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████████▌                 | 194kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████▎                | 204kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████████                | 215kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████████▉               | 225kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████████▌              | 235kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████████████▎             | 245kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████████             | 256kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████████▉            | 266kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████████████▋           | 276kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████████████▍          | 286kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████████████████▏         | 296kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████████████         | 307kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████████████▋        | 317kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████████████████▍       | 327kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████████████████▏      | 337kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████████████████████      | 348kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████████████████████▊     | 358kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████████████████▌    | 368kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████████████████████▎   | 378kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████████████████████   | 389kB 3.4MB/s eta 0:00:01\r\u001b[K     |█████████████████████████████▊  | 399kB 3.4MB/s eta 0:00:01\r\u001b[K     |██████████████████████████████▌ | 409kB 3.4MB/s eta 0:00:01\r\u001b[K     |███████████████████████████████▎| 419kB 3.4MB/s eta 0:00:01\r\u001b[K     |████████████████████████████████| 430kB 3.4MB/s \n",
            "\u001b[?25hCollecting pyro-api>=0.1.1\n",
            "  Downloading https://files.pythonhosted.org/packages/c2/bc/6cdbd1929e32fff62a33592633c2cc0393c7f7739131ccc9c9c4e28ac8dd/pyro_api-0.1.1-py3-none-any.whl\n",
            "Requirement already satisfied: torch>=1.3.0 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (1.3.1)\n",
            "Collecting tqdm>=4.36\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/7f/32/5144caf0478b1f26bd9d97f510a47336cf4ac0f96c6bc3b5af20d4173920/tqdm-4.40.2-py2.py3-none-any.whl (55kB)\n",
            "\u001b[K     |████████████████████████████████| 61kB 4.2MB/s \n",
            "\u001b[?25hRequirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (3.1.0)\n",
            "Requirement already satisfied: numpy>=1.7 in /usr/local/lib/python3.6/dist-packages (from pyro-ppl) (1.17.4)\n",
            "Installing collected packages: pyro-api, tqdm, pyro-ppl\n",
            "  Found existing installation: tqdm 4.28.1\n",
            "    Uninstalling tqdm-4.28.1:\n",
            "      Successfully uninstalled tqdm-4.28.1\n",
            "Successfully installed pyro-api-0.1.1 pyro-ppl-1.1.0 tqdm-4.40.2\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.colab-display-data+json": {
              "pip_warning": {
                "packages": [
                  "tqdm"
                ]
              }
            }
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GomHVM-cBrQY",
        "colab_type": "text"
      },
      "source": [
        "\n",
        "\n",
        "# **Inference**\n",
        "\n",
        "\n",
        "---\n",
        "\n",
        "\n",
        "## Synthetic Mixture of Gaussians\n",
        "\n",
        "We begin by demonstrating the capabilities of Dirichlet process mixture models on a synthetic dataset generated by a mixture of four 2D Gaussians:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3_EyZAbwTMrs",
        "colab_type": "code",
        "outputId": "f5c2222c-c3db-4a34-f021-75f38bbcb4c2",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        }
      },
      "source": [
        "data = torch.cat((MultivariateNormal(-8 * torch.ones(2), torch.eye(2)).sample([50]),\n",
        "                  MultivariateNormal(8 * torch.ones(2), torch.eye(2)).sample([50]),\n",
        "                  MultivariateNormal(torch.tensor([1.5, 2]), torch.eye(2)).sample([50]),\n",
        "                  MultivariateNormal(torch.tensor([-0.5, 1]), torch.eye(2)).sample([50])))\n",
        "\n",
        "plt.scatter(data[:, 0], data[:, 1])\n",
        "plt.title(\"Data Samples from Mixture of 4 Gaussians\")\n",
        "plt.show()\n",
        "N = data.shape[0]"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nEIiItLn/D2c/VG0HbqgiAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CglLQke4gEYd",
        "colab_type": "text"
      },
      "source": [
        "In this example, the cluster parameters $\\theta_i$ are two dimensional vectors describing the means of a multivariate Gaussian with identity covariance. Therefore, the Dirichlet process base distribution $G_0$ is also a multivariate Gaussian (i.e. the conjugate prior), although this choice is not as computationally useful, since we are not performing coordinate-ascent variational inference but rather black-box variational inference using Pyro. \n",
        "\n",
        "First, let's define the \"stick-breaking\" function that generates our weights, given our samples of $\\beta$:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2ngrqFlDQYpV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def mix_weights(beta):\n",
        "    beta1m_cumprod = (1 - beta).cumprod(-1)\n",
        "    return F.pad(beta, (0, 1), value=1) * F.pad(beta1m_cumprod, (1, 0), value=1)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LAC0bWL6Qcc3",
        "colab_type": "text"
      },
      "source": [
        "Next, let's define our model. It may be helpful to refer the definition of the stick-breaking model presented in the first part of this tutorial. \n",
        "\n",
        "Note that all $\\beta_i$ samples are conditionally independent, so we model them using a `pyro.plate` of size `T-1`; we do the same for all samples of our cluster parameters $\\mu_i$. We then construct a Categorical distribution whose parameters are the mixture weights using our sampled $\\beta$ values (line 9) below, and sample the cluster assignment $z_n$ for each data point from that Categorical. Finally, we sample our observations from a multivariate Gaussian distribution whose mean is exactly the cluster parameter corresponding to the assignment $z_n$ we drew for the point $x_n$. This can be seen in the Pyro code below:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "WfnbSIocRlvQ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def model(data):\n",
        "    with pyro.plate(\"beta_plate\", T-1):\n",
        "        beta = pyro.sample(\"beta\", Beta(1, alpha))\n",
        "\n",
        "    with pyro.plate(\"mu_plate\", T):\n",
        "        mu = pyro.sample(\"mu\", MultivariateNormal(torch.zeros(2), 5 * torch.eye(2)))\n",
        "\n",
        "    with pyro.plate(\"data\", N):\n",
        "        z = pyro.sample(\"z\", Categorical(mix_weights(beta)))\n",
        "        pyro.sample(\"obs\", MultivariateNormal(mu[z], torch.eye(2)), obs=data)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1gBQj5RKRn8Z",
        "colab_type": "text"
      },
      "source": [
        "Now, it's time to define our guide and perform inference. \n",
        "\n",
        "The variational family $q(\\beta, \\theta, z)$ that we are optimizing over during variational inference is given by:\n",
        "\n",
        "$$q(\\beta, \\theta, z) = \\prod_{t=1}^{T-1} q_t(\\beta_t) \\prod_{t=1}^T q_t(\\theta_t) \\prod_{n=1}^N q_n(z_n)$$ \n",
        "\n",
        "Note that since we are unable to computationally model the infinite clusters posited by the model, we truncate our variational family at $T$ clusters. This does not affect our model; rather, it is a simplification made in the *inference* stage to allow tractability. \n",
        "\n",
        "The guide is constructed exactly according to the definition of our variational family $q(\\beta, \\theta, z)$ above. We have $T-1$ conditionally independent Beta distributions for each $\\beta$ sampled in our model, $T$ conditionally independent multivariate Gaussians for each cluster parameter $\\mu_i$, and $N$ conditionally independent Categorical distributions for each cluster assignment $z_n$.\n",
        "\n",
        "Our variational parameters (`pyro.param`) are therefore the $T-1$ many positive scalars that parameterize the second parameter of our variational Beta distributions (the first shape parameter is fixed at $1$, as in the model definition), the $T$ many two-dimensional vectors that parameterize our variational multivariate Gaussian distributions (we do not parameterize the covariance matrices of the Gaussians, though this should be done when analyzing a real-world dataset for more flexibility), and the $N$ many $T$-dimensional vectors that parameterize our variational Categorical distributions:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Imw4wcVkT9er",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def guide(data):\n",
        "    kappa = pyro.param('kappa', lambda: Uniform(0, 2).sample([T-1]), constraint=constraints.positive)\n",
        "    tau = pyro.param('tau', lambda: MultivariateNormal(torch.zeros(2), 3 * torch.eye(2)).sample([T]))\n",
        "    phi = pyro.param('phi', lambda: Dirichlet(1/T * torch.ones(T)).sample([N]), constraint=constraints.simplex)\n",
        "\n",
        "    with pyro.plate(\"beta_plate\", T-1):\n",
        "        q_beta = pyro.sample(\"beta\", Beta(torch.ones(T-1), kappa))\n",
        "\n",
        "    with pyro.plate(\"mu_plate\", T):\n",
        "        q_mu = pyro.sample(\"mu\", MultivariateNormal(tau, torch.eye(2)))\n",
        "\n",
        "    with pyro.plate(\"data\", N):\n",
        "        z = pyro.sample(\"z\", Categorical(phi))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "H0He1id0T_bN",
        "colab_type": "text"
      },
      "source": [
        "When performing inference, we set our 'guess' for the maximum number of clusters in the dataset to $T = 6$. We define the optimization algorithm (`pyro.optim.Adam`) along with the Pyro SVI object and train the model for 1000 iterations. \n",
        "\n",
        "After performing inference, we construct the Bayes estimators of the means (the expected values of each factor in our variational approximation) and plot them in red on top of the original dataset.  Note that we also have we removed any clusters that have less than a certain weight assigned to them according to our learned variational distributions, and then re-normalize the weights so that they sum to one:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "x1Yidukpd9wO",
        "colab_type": "code",
        "outputId": "b0cc290b-3285-4f36-c2a6-7195b6801482",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 372
        }
      },
      "source": [
        "T = 6\n",
        "optim = Adam({\"lr\": 0.05})\n",
        "svi = SVI(model, guide, optim, loss=Trace_ELBO())\n",
        "losses = []\n",
        "\n",
        "def train(num_iterations):\n",
        "    pyro.clear_param_store()\n",
        "    for j in tqdm(range(num_iterations)):\n",
        "        loss = svi.step(data)\n",
        "        losses.append(loss)\n",
        "\n",
        "def truncate(alpha, centers, weights):\n",
        "    threshold = alpha**-1 / 100.\n",
        "    true_centers = centers[weights > threshold]\n",
        "    true_weights = weights[weights > threshold] / torch.sum(weights[weights > threshold])\n",
        "    return true_centers, true_weights\n",
        "\n",
        "alpha = 0.1\n",
        "train(1000)\n",
        "\n",
        "# We make a point-estimate of our model parameters using the posterior means of tau and phi for the centers and weights\n",
        "Bayes_Centers_01, Bayes_Weights_01 = truncate(alpha, pyro.param(\"tau\").detach(), torch.mean(pyro.param(\"phi\").detach(), dim=0))\n",
        "\n",
        "alpha = 1.5\n",
        "train(1000)\n",
        "\n",
        "# We make a point-estimate of our model parameters using the posterior means of tau and phi for the centers and weights\n",
        "Bayes_Centers_15, Bayes_Weights_15 = truncate(alpha, pyro.param(\"tau\").detach(), torch.mean(pyro.param(\"phi\").detach(), dim=0))\n",
        "\n",
        "plt.figure(figsize=(15, 5))\n",
        "plt.subplot(1, 2, 1)\n",
        "plt.scatter(data[:, 0], data[:, 1], color=\"blue\")\n",
        "plt.scatter(Bayes_Centers_01[:, 0], Bayes_Centers_01[:, 1], color=\"red\")\n",
        "\n",
        "plt.subplot(1, 2, 2)\n",
        "plt.scatter(data[:, 0], data[:, 1], color=\"blue\")\n",
        "plt.scatter(Bayes_Centers_15[:, 0], Bayes_Centers_15[:, 1], color=\"red\")\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "100%|██████████| 1000/1000 [00:06<00:00, 153.93it/s]\n",
            "100%|██████████| 1000/1000 [00:06<00:00, 152.39it/s]\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DO3XDmEwC5ra",
        "colab_type": "text"
      },
      "source": [
        "The plots above demonstrate the effects of the scaling hyperparameter $\\alpha$. A greater $\\alpha$ yields a more heavy-tailed distribution of the weights, whereas smaller $\\alpha$ will place more mass on fewer clusters. In particular, the middle cluster looks like it could be generated a single Gaussian (although in fact it was generated by two distinct Gaussians), and thus the setting of $\\alpha$ allows the practitioner to further encode their prior beliefs about how many clusters the data contains."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oWBlcZ1vfiBV",
        "colab_type": "text"
      },
      "source": [
        "## Dirichlet Mixture Model for Long Term Solar Observations \n",
        "\n",
        "As mentioned earlier, the Dirichlet process mixture model truly shines when exploring a dataset whose latent geometric structure is completely unknown. To demonstrate this, we fit a DPMM on sunspot count data taken over the past 300 years (provided by the Royal Observatory of Belgium):"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UlhV2Fx_fVGy",
        "colab_type": "code",
        "outputId": "045dbfaa-27a0-4aa6-ee8c-de9f9937aa38",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 295
        }
      },
      "source": [
        "df = pd.read_csv('http://www.sidc.be/silso/DATA/SN_y_tot_V2.0.csv', sep=';', names=['time', 'sunspot.year'], usecols=[0, 1])\n",
        "data = torch.tensor(df['sunspot.year'].values, dtype=torch.float32)\n",
        "N = data.shape[0]\n",
        "\n",
        "plt.hist(df['sunspot.year'].values, bins=40)\n",
        "plt.title(\"Number of Years vs. Sunspot Counts\")\n",
        "plt.xlabel(\"Sunspot Count\")\n",
        "plt.ylabel(\"Number of Years\")\n",
        "plt.show()"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nmJnZ25V5VY9Iz/t8LCLOKYwfXpjt08DMsmIwM7NVldnGvxtwFDBD0vQ87hTSQ5rHkJ50Pxf4Sokx\nmJlZG2Ve1XMvoHYm3VrWNs3MrGu+c9fMrGKc+M3MKsaJ38ysYpz4zcwqxonfzKxinPjNzCrGid/M\nrGKc+M3MKsaJ38ysYpz4zcwqxonfzKxinPjNzCrGid/MrGKc+M3MKsaJ38ysYpz4zcwqxonfzKxi\nnPjNzCrGid/MrGKc+M3MKsaJ38ysYpz4zcwqxonfzKxinPjNzCrGid/MrGKc+M3MKsaJ38ysYlZv\ndAAD2ajxkzudPnfiAXWKxMysdq7xm5lVjBO/mVnFOPGbmVWME7+ZWcWUlvgljZB0l6RHJc2SdGIe\nv4mkOyQ9kf9uXFYMZma2qjJr/K8D34yI0cDOwPGSRgPjgSkRsQ0wJb83M7M6KS3xR8T8iHgoDy8F\nHgM2B8YCl+XZLgM+VVYMZma2qrq08UsaBewA3A8Mi4j5edJzwLAOlhknaZqkaYsWLapHmGZmlVB6\n4pe0PnA9cFJEvFicFhEBRHvLRcSkiGiJiJahQ4eWHaaZWWWUmvglrUFK+ldGxA159AJJw/P04cDC\nMmMwM7O3K/OqHgEXAY9FxDmFSbcAR+fho4Gby4rBzMxWVWZfPbsBRwEzJE3P404BJgLXSjoOeAr4\nXIkxmJlZG6Ul/oi4F1AHkz9e1nbNzKxzvnPXzKxinPjNzCrGid/MrGKc+M3MKsaJ38ysYpz4zcwq\nxonfzKxinPjNzCrGid/MrGKc+M3MKsaJ38ysYpz4zcwqpsvEL+l0SRtKWl3SbyQtkHRkPYIzM7O+\nV0uNf7/85KwDgXnA+4CTS43KzMxKU0viXyP/3R/4n4h4gQ4el2hmZv1fLf3xT5Y0E1gJHC9pCLCi\n3LDMzKwsndb4Ja1GembuXsCHIuI1YDlwSB1iMzOzEnSa+CPiDeBnEbEwIl7P416KiGfrEp2ZmfW5\nWtr475I0tvRIzMysLmpp4z8GOFHSCuAV0nN0IyI2KTMwMzMrRy2Jf0jpUZiZWd10mfgjYqWkjYCt\ngbULk35fWlRmZlaaLhO/pOOAbwCbAzOADwP3AXuWGpmZmZWilpO7JwEtwNyI+CjwIeBvpUZlZmal\nqSXxL4+IVwAkrRkRs4D3lhuWmZmVpZaTu/MlDQZ+CfxG0vPAM+WGZWZmZanl5O7BefC7kj4ObARM\n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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1BE18id2_VlV",
        "colab_type": "text"
      },
      "source": [
        "For this example, the cluster parameters $\\theta_i$ are rate parameters since we are constructing a scale-mixture of Poisson distributions. Again, $G_0$ is chosen to be the conjugate prior, which in this case is a Gamma distribution, though this still does not strictly matter for doing inference through Pyro. Below is the implementation of the model:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "f7mWbeTz_GLI",
        "colab_type": "code",
        "outputId": "bd64a9bc-5aa2-4767-d71f-bdcb6279526c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 298
        }
      },
      "source": [
        "def model(data):\n",
        "    with pyro.plate(\"beta_plate\", T-1):\n",
        "        beta = pyro.sample(\"beta\", Beta(1, alpha))\n",
        "\n",
        "    with pyro.plate(\"lambda_plate\", T):\n",
        "        lmbda = pyro.sample(\"lambda\", Gamma(3, 0.05))\n",
        "    \n",
        "    with pyro.plate(\"data\", N):\n",
        "        z = pyro.sample(\"z\", Categorical(mix_weights(beta)))\n",
        "        pyro.sample(\"obs\", Poisson(lmbda[z]), obs=data)\n",
        "\n",
        "def guide(data):\n",
        "    kappa = pyro.param('kappa', lambda: Uniform(0, 2).sample([T-1]), constraint=constraints.positive)\n",
        "    tau_0 = pyro.param('tau_0', lambda: Uniform(0, 5).sample([T]), constraint=constraints.positive)\n",
        "    tau_1 = pyro.param('tau_1', lambda: LogNormal(-1, 1).sample([T]), constraint=constraints.positive)\n",
        "    phi = pyro.param('phi', lambda: Dirichlet(1/T * torch.ones(T)).sample([N]), constraint=constraints.simplex)\n",
        "\n",
        "    with pyro.plate(\"beta_plate\", T-1):\n",
        "        q_beta = pyro.sample(\"beta\", Beta(torch.ones(T-1), kappa))\n",
        "\n",
        "    with pyro.plate(\"lambda_plate\", T):\n",
        "        q_lambda = pyro.sample(\"lambda\", Gamma(tau_0, tau_1))\n",
        "\n",
        "    with pyro.plate(\"data\", N):\n",
        "        z = pyro.sample(\"z\", Categorical(phi))\n",
        "\n",
        "T = 20\n",
        "alpha = 1.1\n",
        "n_iter = 1500\n",
        "optim = Adam({\"lr\": 0.05})\n",
        "svi = SVI(model, guide, optim, loss=Trace_ELBO())\n",
        "losses = []\n",
        "\n",
        "train(n_iter)\n",
        "\n",
        "samples = torch.arange(0, 300).type(torch.float)\n",
        "\n",
        "tau0_optimal = pyro.param(\"tau_0\").detach()\n",
        "tau1_optimal = pyro.param(\"tau_1\").detach()\n",
        "kappa_optimal = pyro.param(\"kappa\").detach()\n",
        "\n",
        "# We make a point-estimate of our latent variables using the posterior means of tau and kappa for the cluster params and weights\n",
        "Bayes_Rates = (tau0_optimal / tau1_optimal)\n",
        "Bayes_Weights = mix_weights(1. / (1. + kappa_optimal))\n",
        "\n",
        "def mixture_of_poisson(weights, rates, samples):\n",
        "    return (weights * Poisson(rates).log_prob(samples.unsqueeze(-1)).exp()).sum(-1)\n",
        "\n",
        "likelihood = mixture_of_poisson(Bayes_Weights, Bayes_Rates, samples)\n",
        "\n",
        "plt.title(\"Number of Years vs. Sunspot Counts\")\n",
        "plt.hist(data, bins=60, density=True, lw=0, alpha=0.75);\n",
        "plt.plot(samples, likelihood, label=\"Estimated Mixture Density\")\n",
        "plt.legend()\n",
        "plt.show()"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "100%|██████████| 1500/1500 [00:09<00:00, 160.10it/s]\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEICAYAAAC0+DhzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeXxU1fn48c8zkz0kYd/RIIvKGiDg\nWrWuSBGsYsGd1q3f1q9LW3/FLtZqbfGrrbbVVm1VXIuWVkXFuqFVXFhFZZVV2QmQhCRkm8zz++Pe\niUOYJDPJbAnP+/XKa2buPffcczPJPHOWe46oKsYYY0wwT6ILYIwxJvlYcDDGGHMICw7GGGMOYcHB\nGGPMISw4GGOMOYQFB2OMMYew4GAaJSKzROQ3CTq3iMjjIlIsIosSUQZjDmcWHNoQEdksIrtFJDto\n29Ui8m4CixUrJwNnAX1VdVzwDhEZKiKlIjK4wfa3RWRmPAsZDyIyXETedANlsYgsEZFzEl2uxojI\nAhGZ3kyadBG5Q0TWi0iF+7f9dxE5IsZlO1NENsfyHO2FBYe2xwvcmOhCREpEvBEeciSwWVUrGu5Q\n1ZXAvcCjIiJu/lcBfYDbW1nUg4hISjTza8H5BXgFmAd0B3oCNwPliSxXa7jX9G/gXGAqkAcUAJ8B\npyewaCaYqtpPG/kBNgMzgH1AR3fb1cC77vN8QIGUoGPeBa52n08HPgDuA0qAjcCJ7vYtwG7gyqBj\nZwEPAW8CZcB/gSOD9h/j7tsHrAW+0+DYv+J8qFUAZ4a4nt7AXPf49cA17vargCqgDudD8Nchjk0F\nlgM/BHoAe4ATg/YPAd5y814DXBi0b5J77H7gK+CXQfsGur/D77r75gNZwLPAXvf3tgjoGqJMPwdm\nN9j2IPCHoOva7P4uNwLTwnjPe7rl6dDI/vr3332d4qbPd18/DfwJeM0970dAf3efx923GyjF+XAe\nEnTcg8Db7nHvAP2CznMysMQ9bhFwnLv9bvd9q3Lfu/tDlHk8cADo08R198UJivuAdcD3gvY9Ddwe\n9PpMnC8SgddbgR8Bn7vl+weQjhOEKgG/W7ZynIB7PLDM/XvYBdyT6P/1ZPhJeAHsJ4I3y/lgORPn\nW9dv3G2RBgef+8HnBX7jfgA+6P7znO1+EHRw089yX5/i7v8jsMDdl40TUL7rfiCNwvmAHhJ0bClw\nkvshlBHiet4D/gJk4HxzLAJODyrrgmZ+H6PcD483gz+EgA7ANuAKt2xjcD7Yj3b3nw4Mdcs10i33\nRHdfIDg8jhMUMnEC0Ivucy9QSIgPa+Ao9wMn232dgvPBWwjkur+PQe6+XoHfVTPX6AE2AC8Bk4Hu\nDfaHExz2uGVIBZ4Dnnb3fQvngz3PPc8QoGfQcYH3L939Gwn8nXV1913snu9y9/fbyd2/AJjexDXd\nC7zdzHV/APzZ/dsY7V7DqUFluz0obajg8DFOYO0CfMHX/wMHpXW3LQYudp/n4Aa6w/3HmpXaptuA\n/xWRbi04dpOqPq6qdTgfFP2AO1S1WlXfAGpwPiADXlXV91S1Gueb8Qki0g+YiPNP9riq+lT1E+Bf\nwEVBx76kqh+oql9Vq4IL4eZxEvBTVa1S1eXA33E+0MPinvNR4FjgZ0G7JgNfqOqTbtmW4ny4T3GP\nm6+qK91yfQrMBk5tkP2vVPWAqlYCtTgfiANVtU5Vl6jqIc06qroRWOGeH5w+k2JVXRJIAgwTkQxV\n3aGqq8K4Rj9wGk6wuw/YISLviMiA5o4NMsctcy3wDE4gxr2uXJwaIKq6SlV3Bh33svv+VeP8fk8R\nkV7AecBKVf2H+/t9Cqcm9K0wy9MF2NHYThHpD4wDZrh/G8twgvXl4V4wzpeFnaq6F6cGUtBE2lpg\nkIh0UdUyVV0YwXnaLQsObZCqrsD5g5/RgsN3BT2vdPNruK1D0OstQectx/mm3hunT+A4ESkJ/ACX\n4nxbO+TYEHoD+1S1LGjblzj9BpFYiROkDgRtOxI4qUHZpuJ8W0dEThCRd0WkSERKcb59d22Qb3DZ\nZ+E0UT0vIttEZGYTfRHP4nyjBrjEfY2q7ne3/xDYKSKvNOxQb4yqblHVH6jqUUB/nA+zWeEc6wr+\nwD+A+/66XwYewmn+2yUiD4lITlDa4Pe+FKe20Nv9+bLBOSJ57/bivheN6A3s0YP7myL92wh5zY34\nLk6taa2ILBKRCRGcp92y4NB2/Qq4hoP/YQL/TFlB24I/rFuiX+CJiHQAOgPbcT44/quqHYN+Oqjq\n/wQd29SUv9uBzg0+jI7A+YbcWltwmi0alu16d/9snFpOP1XNw6mxSHAGqqpBz2tU9XZVPRanrf3b\nOIEwlOeBM0WkD04N4tmgfF5T1TNxPhjXAw9HemGq+hVOU9wwd1MFrXi/VfV+VR3t5jcEp60+IPi9\nz8Npftru/hzZIKvg9665qZ7fwqmBNhYgtgNdg0flNci/Ndd8SNlUda2qTsPpf/g98C8RyYggz3bJ\ngkMbparrcZqFbgjaVoTzD3SZiHhF5HtAJM0PoUwQkZNFJA24E/hYVbfg1FwGi8jlIpLq/owVkWPD\nLP8W4EPgdyKSISIjcDpsn25lecHp5B4qIpcElW2ciBzt7s/BqbVUicjxwLSmMhOR00VkmIh4cDot\na3E6NUNd106cNvdZwFpVXefm0UtEzhORLJymu4rG8mhw7q4i8isROcq996Mbzjfdj90knwIj3OGu\nmThfGsLi/k7GubWgCrdcwWU6z61lpeP0T72vqjtw3vuhIjJVRFJE5BKcpshX3eN24fS/NOZ1nA7u\nF0VklPu3misiPxCR6aq6Caez+7fukNcC95oDfxvLgW+JSCc3wNwQ8iyh7cIJPPVfSty/4a5uE14p\nTgBp9r1p7yw4tG134HQMB7sGuAWn6j4U5wO4NZ7F+cDZh9OxexmA2xx0Ns4H63acavzdOJ2X4boY\npxN9O/ACTjv/W60sb6AJ5By3rDvcsv0uqGz/gxOUynDa0p9vJsveOIMA9uM0Y71FUI0ghGdxOj6D\n03hx3pcdOO/NiThNTIjIaW7TVyjVOAH+HZzO7s/dx++517oK+C3OwIO1OJ384eqI02dTgjPYYQfw\nh6D9T+MEhT3ACNz+IPdLyCTgp+613IzToV/sHnc/cLHbpBecH+7xClwAvAHMwfm9fo7TL/C2m2wq\nMAjnvZsD/ExV33X3zQJW4zQ1/QenJhgWt0n2X8Bmt3zdgQnAavfv4V5gqqrWhJtneyVBtWdjjAFA\nRJ4G1qvq7Ykui0kMqzkYY4w5hAUHY4wxh7BmJWOMMYewmoMxxphDhDWpmIiMx5k6wQv8XVVnNtif\nDjzJ19MUTFXVzSJyFjATSMMZJneLqs53jxmDM+ogE2f+nRtVVUWkM84QzXycERTfCRoFEVLXrl01\nPz8/nEsxxhjjWrp06R5VDTnTQrPNSu5sml/gTAWwla/nIVkVlOYHwAhV/b6ITAO+rapTRWQUsEtV\nt4vIMOB1Ve3jHrMIZ3zyQpzg8CdVfU1E/g9nDPpMEZmBM1/LT5sqY2FhoS5ZsqSpJMYYYxoQkaWq\nWhhqXzjNSuNwhrRtdMf+zubruWMCJgNPuM/nAGeIiKjqJ6q63d2+Esh0b2rpBeSq6sfumOcngfND\n5PVE0HZjjDFxEk5w6MPB88xs5dA5TurTqKoP5y7DLg3SXAgscyfx6uPmEyrPHu5dmODcANMjVKFE\n5FpxFj1ZUlRUFMZlGGOMCVdcOqRFZCjO3bPXRXKcW6sI2e6lqo+oaqGqFnbr1pLJSY0xxjQmnA7p\nbQRNwIWzCEfDydECaba687Tk4XRMIyJ9caZGuEJVNwSl79tInrtEpJeq7nCbn3ZHcD3GJERtbS1b\nt26lqqqq+cTGxFlGRgZ9+/YlNTU17GPCCQ6LceY674/zAT4NZyriYHOBK3FWmZoCzHdHHnXEmYxr\nhqp+EEjsfvDvdyc9W4gzZ8ufG+Q10318KeyrMSZBtm7dSk5ODvn5+TirYBqTHFSVvXv3snXrVvr3\n7x/2cc02K7l9CNfjzKS4GnheVVeKszj4JDfZo0AXEVmPM+VvYJ2B63Fma7xNRJa7P93dfT/AmSp5\nPc5KV6+522cCZ4nIOpzJy9rdgvGm/amqqqJLly4WGEzSERG6dOkSca02rPscVHUeznDT4G23BT2v\n4uAVwALbf4Mzq2OoPJfw9Zz0wdv3AmeEUy5jkokFBpOsWvK3aXdIG2OMOYQFh1g5sA/uPRqWzkp0\nScxhwuv1UlBQUP8zc2bjLbIvvvgiq1Z9vYT1bbfdxltvtXopDUpKSvjLX/4S8XG333479957b8jt\nIsL69evrt91///2ICIEbXydMmEBJSWPLYcDmzZt59tmmlt9ondtvv50+ffpQUFDAoEGDuOCCCw76\n3UbLiSeeCMT+egIsOMTKwoehfCe88zuotREsJvYyMzNZvnx5/c+MGY0vMd4wONxxxx2ceeaZrS5D\nS4NDU4YPH87s2V+v5/PPf/6ToUOH1r+eN28eHTt2bPT4ln6Y1tXVhZ325ptvZvny5axbt46pU6dy\n+umnE+37rz780Fm3y4JDW+argUUPQ+cBToD4vLmFxoyJnRkzZjBkyBBGjBjBT37yEz788EPmzp3L\nLbfcQkFBARs2bGD69OnMmTMHgPz8fG699VYKCgooLCxk2bJlnHPOOQwYMICHHnoIgPLycs444wxG\njx7N8OHDeemll+rPtWHDBgoKCrjlllsAuOeeexg7diwjRozgV7/6ehXTu+66i8GDB3PyySezdu3a\nRst//vnn1+e/YcMG8vLy6Nq1a/3+/Px89uzZw+LFixkxYgRVVVVUVFQwdOhQVqxYwYwZM3j//fcp\nKCjgvvvuY9asWVx//fX1x0+cOJF3330XgA4dOvDjH/+YkSNH8tFHH7F06VJOPfVUxowZwznnnMOO\nHTtoztSpUzn77LPrP8Aby+O0007jpz/9KePGjWPw4MG8//77AKxcuZJx48ZRUFDAiBEjWLduXX3Z\nAr/j4Os55ZRTWL58ef35Tz75ZD799NNmy9mcsDqkTYSK1kBlMUy4F+b9BLYtg9FXJLpUJl5emwE7\nP49unj2Hw7lND9yrrKykoKCg/vWtt97KmWeeyQsvvMCaNWsQEUpKSujYsSOTJk1i4sSJTJkyJWRe\nRxxxBMuXL+fmm29m+vTpfPDBB1RVVTFs2DC+//3vk5GRwQsvvEBubi579uzh+OOPZ9KkScycOZMV\nK1bUf1i98cYbrFu3jkWLFqGqTJo0iffee4/s7Gxmz57N8uXL8fl8jB49mjFjxoQsS25uLv369WPF\nihW89NJLTJ06lccff/yQdGPHjmXSpEn84he/oLKykssuu4xhw4Yxc+ZM7r33Xl555RUAZs2a1ejv\nsKKiguOOO47f//731NbWcuqpp/LSSy/RrVs3nnvuOX7+85/z2GOPNfk+AIwePZo1a9ZQW1vL//7v\n/zaah8/nY9GiRcybN49f//rXvPXWWzz00EPceOONXHrppdTU1BxSg2l4PZ07d2bWrFncf//9fPHF\nF1RVVTFy5Mhmy9gcCw6xsNutrvcYBl0Hw551iS2POSwEmpWC+Xw+MjIyuOqqq5g4cSITJ04MK69J\nk5xR6sOHD6e8vJycnBxycnJIT0+npKSE7Oxsfvazn/Hee+/h8XjYtm0bu3btOiSfN954gzfeeINR\no0YBTo1j3bp1lJWV8e1vf5usrKyDzteYadOmMXv2bF5//XXefvvtkMEBnL6TsWPHkpGRwZ/+9Kew\nrjWY1+vlwgsvBGDt2rWsWLGCs846C3CamXr16hVWPoEJTZvL44ILLgBgzJgxbN68GYATTjiBu+66\ni61bt3LBBRcwaNCgJs910UUXceedd3LPPffw2GOPMX369LCvtykWHGJh10rwpkGXAdB1EHzxRqJL\nZOKpmW/48ZSSksKiRYt4++23mTNnDg888ADz589v9rj09HQAPB5P/fPAa5/PxzPPPENRURFLly4l\nNTWV/Pz8kOPoVZVbb72V6647eOac+++/P6LrmDhxIrfccguFhYXk5uY2mm7v3r2Ul5dTW1tLVVUV\n2dnZh6RJSUnB7/fXvw4ud0ZGBl6vt77sQ4cO5aOPPoqorACffPIJhYWFzeYR+N16vV58Ph8Al1xy\nCccddxyvvvoqEyZM4OGHH+b0009v9FxZWVmcddZZvPTSSzz//PMsXbo04vKGYn0OsbB7lVNj8KY6\njxW7nWYmY+KsvLyc0tJSJkyYwH333VffFp2Tk0NZWVmL8y0tLaV79+6kpqbyzjvv8OWXX4bM95xz\nzuGxxx6jvLwcgG3btrF7925OOeUUXnzxRSorKykrK+Pll19u8nxZWVncfffd/PznP28y3XXXXced\nd97JpZdeyk9/+tOQZcrPz2f58uX4/X62bNnCokWLQuZ19NFHU1RUVP/BXltby8qVK5v5zcC//vUv\n3njjDS6++OIW5bFx40aOOuoobrjhBiZPnsxnn3120P5Q793VV1/NDTfcwNixY+nUqVOzZQyH1Rxi\nYdcqyD/Zed51sPO4Zz30G5u4Mpl2r2Gfw/jx47nxxhuZPHkyVVVVqCp/+MMfAKeZ5pprruFPf/pT\nfUd0JC699FLOO+88hg8fTmFhIccccwwAXbp04aSTTmLYsGGce+653HPPPaxevZoTTjgBcDpVn376\naUaPHs3UqVMZOXIk3bt3Z+zY5v83pk2b1uT+J598ktTUVC655BLq6uo48cQTmT9/Pt/4xjfwer2M\nHDmS6dOnc9NNN9G/f3+GDBnCsccey+jRo0Pml5aWxpw5c7jhhhsoLS3F5/Nx0003HTRSKuC+++7j\n6aefpqKigmHDhjF//nwCE4KGm0fA888/z1NPPUVqaio9e/bkZz/72UH7R4wYcdD13HzzzYwZM4bc\n3Fy++93vNvdrDFu7WEM6qRb7qSqFmUfAGb+Cb/wI9m6AP4+GyX+BUZcmunQmRlavXs2xxx6b6GKY\nw9T27ds57bTTWLNmDR5P6AahUH+jrV3sx0Si5CvnsfNRzmPHI0E8ULwpcWUyxrRbTz75JMcddxx3\n3XVXo4GhJaxZKdpK3TWM8txZzr0pkN0Nyg8dyWGMMa11xRVXcMUV0R8qbzWHaKsPDkHLVXToAWUW\nHNq79tBEa9qnlvxtWnCIttItzjDW7KDV6Tr0sJpDO5eRkcHevXstQJikE1jPISMjI6LjrFkp2kq3\nQm4fCG7769DDuffBtFt9+/Zl69atUZ9Px5hoCKwEFwkLDtFWsuXgJiWADt2dex38/oODhmk3UlNT\nI1ply5hkZ59U0Va6FToecfC2nJ7g90HlvsSUyRhjImTBIZrqaqFsR+iaA1i/gzGmzQgrOIjIeBFZ\nKyLrReSQSeJFJF1EnnP3LxSRfHd7FxF5R0TKReSBoPQ5QWtKLxeRPSJyv7tvuogUBe27OjqXGgdl\nOwGF3N4Hb+/Qw3m04GCMaSOa7XMQES/wIHAWsBVYLCJzVTV4qaOrgGJVHSgi04C7galAFfBLnLWi\n69eLVtUyoP4+fxFZCvw7KL/nVPV62pry3c5jh54Hbw8EBxvOaoxpI8KpOYwD1qvqRlWtAWYDkxuk\nmQw84T6fA5whIqKqFaq6ACdIhCQig4HuwPsRlz7ZBGoGgWakgPqaw874lscYY1oonODQB9gS9Hqr\nuy1kGlX1AaVAlzDLMA2nphA8QPxCEflMROaISL9QB4nItSKyRESWJM3wwYpAzaFBcEjvACkZcGBv\n/MtkjDEtkAwd0tOAfwS9fhnIV9URwJt8XSM5iKo+oqqFqloYmP0w4QLNStkhypPZ2abtNsa0GeEE\nh21A8Lf3vu62kGlEJAXIA5r9miwiI4EUVa1fnUJV96pqtfvy70DotQOTUfkuyOwEKemH7svsBJUl\n8S+TMca0QDjBYTEwSET6i0gazjf9uQ3SzAWudJ9PAeZrePMIXMzBtQZEJHgdvknA6jDySQ7luyG7\ne+h9mZ2s5mCMaTOaHa2kqj4RuR54HfACj6nqShG5A1iiqnOBR4GnRGQ9sA8ngAAgIpuBXCBNRM4H\nzg4a6fQdYEKDU94gIpMAn5vX9FZcX3yV7z60vyEgsyPs2xjf8hhjTAuFNX2Gqs4D5jXYdlvQ8yrg\nokaOzW8i36NCbLsVuDWcciWd8l3Qp5FWsMxOcMDukDbGtA3J0CHdflQUNVFzcJuVbNZOY0wbYMEh\nWqrLoaa86eBQVw21lfEtlzHGtIAFh2ipv8ehR+j9mZ2cR+uUNsa0ARYcoqXcvRGvqdFKYMHBGNMm\nWHCIlsamzgiw4GCMaUMsOERLfXBopFkpq7PzaMHBGNMGWHCIlooiQCCrkSmlrOZgjGlDLDhES/ku\nyO4K3kZuHbHgYIxpQyw4REt5UeNNSgCpWeBJteBgjGkTLDhES/mu0LOxBohARi5U749fmYwxpoUs\nOERL+e6maw4A6blQZcHBGJP8LDhEg6pzE1xjw1gD0nOguiw+ZTLGmFaw4BAN1fvBV9V8cMjIs2Yl\nY0ybYMEhGupXgLOagzGmfbDgEA2B4JBjfQ7GmPbBgkM0NHd3dICNVjLGtBEWHKIh0mYlW9PBGJPk\nLDhEQ/ku8KR8fRd0Y9JzQeugpiI+5TLGmBYKKziIyHgRWSsi60VkRoj96SLynLt/oYjku9u7iMg7\nIlIuIg80OOZdN8/l7k/3pvJKauW7nVqDp5lfZ3qO82id0saYJNdscBARL/AgcC4wBLhYRIY0SHYV\nUKyqA4H7gLvd7VXAL4GfNJL9papa4P7sbiav5BXOPQ7gDGUF63cwxiS9cGoO44D1qrpRVWuA2cDk\nBmkmA0+4z+cAZ4iIqGqFqi7ACRLhCplXBMfHX/mu8IJDeq7zaDUHY0ySCyc49AG2BL3e6m4LmUZV\nfUAp0Mjc1Qd53G1S+mVQAAgrLxG5VkSWiMiSoqKiME4VQ+Vh1hwCzUpVpbEtjzHGtFIiO6QvVdXh\nwDfcn8sjOVhVH1HVQlUt7NatiQnvYs3vD29eJXCGsoLVHIwxSS+c4LAN6Bf0uq+7LWQaEUkB8oC9\nTWWqqtvcxzLgWZzmqxbllVCVxc4IpHCCQ32HtPU5GGOSWzjBYTEwSET6i0gaMA2Y2yDNXOBK9/kU\nYL5q44P5RSRFRLq6z1OBicCKluSVcIEb4JqarjvA+hyMMW1EI8uWfU1VfSJyPfA64AUeU9WVInIH\nsERV5wKPAk+JyHpgH04AAUBENgO5QJqInA+cDXwJvO4GBi/wFvA395BG80pK4d4dDUF9DlZzMMYk\nt2aDA4CqzgPmNdh2W9DzKuCiRo7NbyTbMY2kbzSvpBS4Ozqc4ODxQloHa1YyxiQ9u0O6tSoCwSGM\n0UrgNC1ZcDDGJDkLDq1VvgtSMr5uMmpOeo41Kxljkp4Fh9YK3OMQ7n16GbnWIW2MSXoWHFqrfFd4\n/Q0B1qxkjGkDLDi0Vrg3wAXYanDGmDYgrNFKpgnlu6HfcQBMe+Sjg3bNvvaEQ9Nn2GpwxpjkZzWH\n1qirhQN7rVnJGNPuWHBojYo9gIY/jBWc4FB7AOp8MSuWMca0lgWH1ijf6TxGUnOon3zPag/GmORl\nwaE1St35B/MazmDeBFsNzhjTBlhwaI39bnDI7Rv+MelWczDGJD8LDq2xfxt40yArnHWNXFZzMMa0\nARYcWqN0G+T2Bk8Ev8ZAn4MNZzXGJDELDq2xf1tkTUoA6XnOo9UcjDFJzIJDa5Rui6wzGoKalWwd\naWNM8rLg0FJ+P5Rtd5qVImHNSsaYNsCCQ0tV7Aa/D3IjrDmkZIAnxZqVjDFJzYJDS5VscR7zIuxz\nELEpNIwxSS+s4CAi40VkrYisF5EZIfani8hz7v6FIpLvbu8iIu+ISLmIPBCUPktEXhWRNSKyUkRm\nBu2bLiJFIrLc/bm69ZcZA8WbnMdO/SM/Nj0HqsujWx5jjImiZoODiHiBB4FzgSHAxSIypEGyq4Bi\nVR0I3Afc7W6vAn4J/CRE1veq6jHAKOAkETk3aN9zqlrg/vw9oiuKl32bAIFO+ZEfm24L/hhjkls4\nNYdxwHpV3aiqNcBsYHKDNJOBJ9znc4AzRERUtUJVF+AEiXqqekBV33Gf1wDLgAjbZxKseJPTGZ2a\nEfmx6R2sWckYk9TCCQ59gC1Br7e620KmUVUfUAqEdduwiHQEzgPeDtp8oYh8JiJzRKRfI8ddKyJL\nRGRJUVFROKeKrn0bofNRLTvWFvwxxiS5hHZIi0gK8A/gT6q60d38MpCvqiOAN/m6RnIQVX1EVQtV\ntbBbt27xKXCwfZta1qQETnCosT4HY0zyCic4bAOCv733dbeFTON+4OcBe8PI+xFgnareH9igqntV\ntdp9+XdgTBj5xFd1mTOU1WoOxph2KpzgsBgYJCL9RSQNmAbMbZBmLnCl+3wKMF9VtalMReQ3OEHk\npgbbewW9nASsDqOM8VW82Xns3IKRSmDBwRiT9JpdQ1pVfSJyPfA64AUeU9WVInIHsERV5wKPAk+J\nyHpgH04AAUBENgO5QJqInA+cDewHfg6sAZaJCMAD7sikG0RkEuBz85oepWuNnn1uC1hLhrHCwavB\neW0Zb2NM8gnrk0lV5wHzGmy7Leh5FXBRI8fmN5KtNJL+VuDWcMqVMPvcexxaWnNI6+A81pRBZqfo\nlMkYY6LI7pBuieJNzhoOGXktO97WdDDGJDlr0wjDtEc+Ouj1L/YsZ1j3FnZGQ1BwsBFLxpjkZDWH\nFuhRt73l/Q1gNQdjTNKz4BChFK2hS11Ry4exQtA60hYcjDHJyYJDhLrV7cKDtrwzGoJqDjaFhjEm\nOVlwiFBP33bnSatqDu5oJas5GGOSlAWHCPXw7XCeWJ+DMaYds+AQoR5126mUTMju2vJM6u9zsNFK\nxpjkZMEhQj18O9jp7e2s6NZSHq8TIKzmYIxJUhYcItSjbge7U3o1n7A56TnWIW2MSVoWHCIgWkcP\n3052pvRufWY2+Z4xJolZcIhAl7o9pOBjlzcKNQdrVjLGJDELDhHoXrcTgN0pPVufmdUcjDFJzIJD\nBLrUOcuR7vVGYeW59BybW8kYk7QsOESgU52zuN0+TyuGsQak51rNwRiTtGxW1hAazsIa0Nm/lwrJ\nptqT0fqT2GglY0wSs5pDBMMmyfEAACAASURBVDrX7WGft0t0Mgv0OTS9mqoxxiREWMFBRMaLyFoR\nWS8iM0LsTxeR59z9C0Uk393eRUTeEZFyEXmgwTFjRORz95g/ibtWqIh0FpE3RWSd+5g0S6V1rttL\nsTcKTUrgzK+kdVBbGZ38jDEmipoNDiLiBR4EzgWGABeLyJAGya4CilV1IHAfcLe7vQr4JfCTEFn/\nFbgGGOT+jHe3zwDeVtVBwNvu66TQqW4v+zxRrDmA9TsYY5JSODWHccB6Vd2oqjXAbGBygzSTgSfc\n53OAM0REVLVCVRfgBIl6ItILyFXVj1VVgSeB80Pk9UTQ9oQSraOjf18Um5XcNR1sfiVjTBIKJzj0\nAbYEvd7qbguZRlV9QCnQ1KdoHzefUHn2UFV36lN2Aj3CKGPMdfSX4MUfxWYlW9PBGJO8krpD2q1V\nhOyxFZFrRWSJiCwpKiqKeVk61e0BiG6HNFizkjEmKYUTHLYB/YJe93W3hUwjIilAHrC3mTz7NpLn\nLrfZKdD8tDtUBqr6iKoWqmpht25RuCmtGR39xQCUeDpHJ8M0W/DHGJO8wgkOi4FBItJfRNKAacDc\nBmnmAle6z6cA891v/SG5zUb7ReR4d5TSFcBLIfK6Mmh7QuX4neaf/Z686GRoNQdjTBJr9iY4VfWJ\nyPXA64AXeExVV4rIHcASVZ0LPAo8JSLrgX04AQQAEdkM5AJpInI+cLaqrgJ+AMwCMoHX3B+AmcDz\nInIV8CXwnWhcaGvl+EsBKPPkRifDQIe0BQdjTBIK6w5pVZ0HzGuw7bag51XARY0cm9/I9iXAsBDb\n9wJnhFOueMr176eWVKokMzoZWs3BGJPEkrpDOpnk+EudWkNrVoALlpIOnlQLDsaYpGTBIUw5/v3R\na1ICJ8jY/ErGmCRlwSFMOXX7KYtWZ3SArelgjElSFhzCVN+sFE0ZuVBlNQdjTPKxKbvDlOPfz/6g\n4NDYtN7BQqWZfe0JX79Iz7NmJWNMUrKaQxg8Wke2lke/WSkjF6pKo5unMcZEgdUcwpDtL8ODRr9Z\nKT2JmpUO7IPlz4I3FQoudaYUN8Yctiw4hCFwd3T0+xzyoDoJag77NsET50GpO7/iksfhyrnQoXti\ny2WMSRhrVgpDbn1wiEGzUnUZ+P3RzTcS/jp44ftO38fVb8PlL8C+jfDqjxJXJmNMwllwCEO23xlu\nWuGJclNLei6oP7FrOnw6G7Z8DOPvhr6FMOB0+OatsPplWPdW4spljEkoCw5hyNIKAA54sqObcUZg\nfqUE9Tv4/fDB/dBjOIyc9vX2E66H3D7OPmPMYcmCQxiy9AAAByTKwSEw+V6iOqXXvwV7voCTbjx4\nWhBvKhz3fdj8PmxfnpiyGWMSyoJDGDL9gZpDVnQzTnTNYfkzkNUFhoZYiXX0FeBNg0//Ef9yGWMS\nzoJDGLL0ALWk4pO06Gac7nZwJ6LmUFkCa1+DYVOcmkJDmR1h8Hj4fA7U1ca/fMaYhLLgEIZMf0X0\naw3gDGWFxNwIt+YVqKuGkVMbTzNiKhzYA5v+G79yGWOSggWHMGRpRfT7GyCoWSkRweFVyOsHvUc3\nnmbgGZCSCV+8Eb9yGWOSggWHMGT6D1AZi5pDojqkaypgw3w4ekLT61OkZkL/U2Dd69D4qq/GmHbI\ngkMYYlZzSM0ET0r8O6Q3vgu+KjhmQvNpB58NxZth7/pYl8oYk0TCCg4iMl5E1orIehGZEWJ/uog8\n5+5fKCL5QftudbevFZFz3G1Hi8jyoJ/9InKTu+92EdkWtC+MT7DYyvQfiP49DuAu+JOAyfc2vec0\nFx1xYvNpB57lPK6zpiVjDifNzq0kIl7gQeAsYCuwWETmquqqoGRXAcWqOlBEpgF3A1NFZAgwDRgK\n9AbeEpHBqroWKAjKfxvwQlB+96nqva2/vOjI0gNUSgyalcDplG4QHBpO9X3QNN/RsPkD6DcOUsIY\nfdXpSOh2jBMcTvhhdMthjEla4dQcxgHrVXWjqtYAs4HJDdJMBp5wn88BzhARcbfPVtVqVd0ErHfz\nC3YGsEFVv2zpRcRaVqxGK4EzZLSyJDZ5h3JgH+xaAfknh3/MoLOcgFKdwGk+jDFxFU5w6ANsCXq9\n1d0WMo2q+oBSoEuYx04DGt5pdb2IfCYij4lIp1CFEpFrRWSJiCwpKioK4zJaSJVMPUBlLPocADI6\nQlUcg8NXHwEKR54U/jGDzgZ/rQ1pNeYwktAOaRFJAyYB/wza/FdgAE6z0w7g96GOVdVHVLVQVQu7\ndesWszJmaCUetP3UHDZ/ACkZ0GdM+Mf0Ox5Ss2CjBQdjDhfhBIdtQL+g133dbSHTiEgKkAfsDePY\nc4FlqrorsEFVd6lqnar6gb9xaDNUXAUm3YtZzSGzU3xrDl8ugL5jITUj/GNS0uCIE6zmYMxhJJzg\nsBgYJCL93W/604C5DdLMBa50n08B5ququtunuaOZ+gODgEVBx11MgyYlEekV9PLbwIpwLyYWMv3u\npHuxGK0ETrNSZUl87iOoLIEdn0XWpBTQ/xQoWgNlO6NfLmNM0ml2tJKq+kTkeuB1wAs8pqorReQO\nYImqzgUeBZ4SkfXAPpwAgpvueWAV4AN+qKp1ACKSjTMC6roGp/w/ESkAFNgcYn9cfV1ziGGzktY5\nazqk58TmHAFffQxoZJ3RAUed6jxueh9GXBTVYhljkk9Yy4Sq6jxgXoNttwU9rwJCfmKo6l3AXSG2\nV+B0Wjfcfnk4ZYqXrHjUHMD5Vh/r4PDlAmem1b6FkR/bc4RT1k3vWnAw5jBga0g3I7N+LYcY1hzA\n7Xfo12TSVtu8gNXewfz68abXaAh5X4XH69Q4Nr4Hqkz728fhHRcFDe/7iOW58NfBujeh5EvoMczp\na/HYRALm8GPBoRlZ7loOlfGoOcRS1X7Y8Smrs5uYhbU5R53mzOZavDlKhUoyezfA7EucvpWAI0+G\nC/8Gub0TVy5jEsC+EjUjvjWHGNqyENTPqvQRLc+jf6DfoR2OWir5Ch4bDxVFcNEs+NEamHgf7FgO\nT5wH5bsTXUJj4sqCQzOy/BX4EaokMzYniFfNYfP74Enli9RjW55H10HQoWf7u9+hrhb++V2orYTp\n82DotyG3FxR+Dy77N+zfDv+6yllz25jDhAWHZmRpBVWSiUqMflXxqjls/gD6jKbGE8H9DQ2JOKOW\nNr2HaDv6oFz8d9i2BCb9Ebofc/C+I46Dc//Pmaxw4V8TUz5jEsCCQzNiNiNrQHouiDe2NYfqctj+\nScuGsDbU/1Q4sIe+vqSdCisyB/bBO7+DAafD0AtCpxl1mTOFyDu/s/s8zGHDgkMzsrQidvc4gPNt\nPCMPKotjd44tC517KVpy81tD/U8BYFh10yOe2oyP/+qsxHf2XY0vfCQC42c6a2D89+74ls+YBDns\nRyuFGiYZLMt/IDYL/QTL7BST4BC4tmn7n+M8PHzvLWn914GO/aDzUQyrWM5rHb7d+kKG0Nx7EjVV\n+2HRw3DMROgxpOm0XQbAqEvhk6fhlP/n9EkY045ZzaEZmVoR22YlgKwuULkvZtkfW/05G1IHU+2J\nUqd6/1M5tuZzPM7N7m3X5/901tI46abw0p90k3MfxEcPxLZcxiQBCw7NyPLHcKGf+pN0gQN7Y5J1\nur+KAbVfsLo1Q1gb6n8KWXqAo2q/iF6eifDJU9B9aPh3jHfuD8OnwJLHoCI275cxycKCQzOcmkM8\ngkNsag6DaleRgo/VacOjl2l76HfY+bnTST/6isb7GkI5+UfOkNdFj8SubMYkAQsOzYhLn0NWZ6fm\nEIOZWYdUf44fD2vTmmlTj0R2VzanHMWw6k+jl2e8LXsKvOkw4juRHdf9GGdlvKWznPsjjGmnLDg0\nwau1pFFDZTxqDr4qqD0Q9ayPrfmcjakDoz79x4r0AgbXrCRVq6Oab1zUVsFnz8GxE53AHKnC70H5\nTlj7WvTLZkySsODQhMC8SrGvObiT00a53yFVqxlYsza6TUqulekjSaOWo2tWRT3vmFv3hnPT4ajL\nWnb8oLMht6/T92BMO2XBoQlZGuPpuutPFJvgMKhmDanURrcz2rU6bTg+vG2z32H1XMjsDPmntOx4\njxfGXAkb33Em6zOmHTrs73NoSqY/xgv94IzpH1yzgzuA385ZwGcZVSHThKPhNNZDqj/Dj4c1aUNb\nXcZDeLLYkHo0Q9tav4OvGr54HYZMBm8r/vxHXQ7vznT6Hs6+M2rFMyZZWM2hCfGqOZR5cgHI8e+P\nar5Daj5jc+pRHPB0iGq+ASvTRzKg9ov6INombHwXqvc7waE1cnvB0efCp7OtY9q0SxYcmlC/fnSM\n73PY78kDohwcaqsYWLMmJv0NASvSC/DgZ0jNZzE7R9StmuvMZxWYfrw1Rl0GFbudPgxj2pmwgoOI\njBeRtSKyXkRmhNifLiLPufsXikh+0L5b3e1rReScoO2bReRzEVkuIkuCtncWkTdFZJ372Kl1l9hy\n9etHx7jmcECy8eOJbnDYtpQ0almVFv3+hoAv0o6lhrS207RUVwtrX4XB4yElrfX5DTwLOvRwhsUa\n0840GxxExAs8CJwLDAEuFpGGg+avAopVdSBwH3C3e+wQYBowFBgP/MXNL+CbqlqgqsG3qM4A3lbV\nQcDb7uuEyIr1Qj8uFQ9lnpzoBofNC/AjrEkfFr08G/BJGmvShradTukvP3TmsBoyKTr5eVNg5MVO\nzcFmazXtTDg1h3HAelXdqKo1wGygYYPtZOAJ9/kc4AwREXf7bFWtVtVNwHo3v6YE5/UEcH4YZYyJ\n+g7pWN/nAJR58sjzR3Ha7i8X8FVKfyo8OdHLM4QV6QUc4dtMXl0MZ5WNlnVvgDfNmZ47WkZd7sx4\n++k/openMUkgnODQB9gS9Hqruy1kGlX1AaVAl2aOVeANEVkqItcGpemhqjvc5zuBHqEKJSLXisgS\nEVlSVFQUxmVELstfQQ2p+CQKTRDNKPF0Is8fpSk0fNWwZTGr02PX3xCwIr0AgKFtofaw7k1n2vK0\nKDYTdh0IR5zgzNYagzvcjUmURA5lPVlVt4lId+BNEVmjqu8FJ1BVFZGQ/3Gq+gjwCEBhYWFM/isz\nNfoL/TQ2LLXE25mBNWtC7ovYtmXgq2RVTsv6GyKZMntT6kD2e3IZXb2oReeKm+IvYc9aGDM9+nmP\nuhxe+gF89TEceULz6Y1pA8KpOWwD+gW97utuC5lGRFKAPGBvU8eqauBxN/ACXzc37RKRXm5evYCE\nrezuLPQT4xvgXCWeTnT0R6lp5ssFAKxJi11/Q4CKl6UZxzO6aqFTY0lW6990HgedFf28h54PaR2c\n2oMx7UQ4wWExMEhE+otIGk4H89wGaeYCV7rPpwDzVVXd7dPc0Uz9gUHAIhHJFpEcABHJBs4GVoTI\n60rgpZZdWutl+Q/EfkZWV4m3ExlaRYY/CvMrbXofug+lzJvX+rzCsDDjZKfzfuN/43K+Fln3FnTK\nhy4Do593WjYMuwBWvgDVZdHP35gEaDY4uH0I1wOvA6uB51V1pYjcISKBYR+PAl1EZD3wI9wRRqq6\nEngeWAX8B/ihqtbh9CMsEJFPgUXAq6r6HzevmcBZIrIOONN9nRCZcaw5lHqcEbutrj34qp1lQfu3\ncGqIFliRXuCM6Frd8DtDkqitgk3/dYaeRjI9dyRGXQG1FbDi37HJ35g4C6vPQVXnAfMabLst6HkV\ncFEjx94F3NVg20ZgZCPp9wJnhFOuWMvyH2BnSse4nKvE48wO2rGumJ0pDfv7I7B1iTPDa/9vHDwU\nIIZ8ksayjOM4ec2rMPH+1k1LEQtffejMeDvo7Nido28hdD3aaVoac2Xz6Y1JcnaHdBMyNQ6rwLmK\nvU5waPWIpc3vAwJHntj6QkVgUcZJzlKnX34Q1/OGZd2bkJIB+SfH7hwiMPpy2LoIitbG7jzGxIkF\nhyZk+eOwfrQr0KzUqa6VwWHTe9BrBGTG98byT9MLITULViZhs8q6N53AkBbjQD9iGnhSnOVHjWnj\nLDg0QtTvDGWNU59DuScHH97W9TnUVsLWxZD/jegVLEzVngw49jxY8YJTjmSxbyPsXRfbJqWADt2c\nqTlsMj7TDiRZ43DySNcqPGhc7o4GZwqNUk+nVt1p/JuHHucXdTXMXNud5V+Gf69CtPxmWwG/qH6O\nP/7lj3yUeeohU4hHUzj3Ysy+9gRnlBLAwDNDHhdOGUOdq9HjRl8Ba16BL/7jBMsoiOj8xkSJ1Rwa\nEZh0L141B3D6Hbr497T4+CHVn1KHJy73N4SyMm0ke7zdOOXAWwk5f0jr34TOA6DLgPicb8AZ0KGn\n3fNg2jwLDo2oXyI0Tn0OAHu83elS1/J7/oZWf8bG1MFUxam205CKh/czz2Bk9VI61UV3VbsWqa10\n+mBiceNbY7wpUHCJM4/T/h3NpzcmSVlwaESmOyNrvEYrgRMcutYVtWiOnnR/JQNq17IyBkuCRuK9\nrDPx4OfkA/MTWg4ANn/gDOuNZ3AAZ50H9dtkfKZNs+DQiKzAQj9x/Ba+19uddK0mx18a8bFH16wk\nhTpWpYW8fSRudqT0ZXXaMM48MA/8/oSWhXWvOyOojozhENZQugxwJvizyfhMG2bBoRH1C/3EseZQ\n5O0O4NQeIjSs5lN8pLC2letFR8Mb2efRo24HrE9g34Oqs1Z0/1MhNSP+5x91Oezb4KwhYUwbZMGh\nEdn+coCYr4cQbI+3GwBdW9DvMLx6GV+kHesMKU2wRRknUuzpBIseSVgZevu2QMmXMDgOQ1hDGTIJ\n0nJg2RPNpzUmCdlQ1kZkucGh3NMhbufcW19ziCw45NUV0792A7NzpsegVJGrk1TezprAlPXPwt4N\nB40UimQ68Naon0K8Bfc3RKWMadkw6lJY/Hc4/ZfQsV/zxxiTRKzm0IgOWk4NqdRKetzOWebJpUrS\nIw4Ow6o/AeDT9DGxKFaLvJ09ATxe58MxAUZVLYLuQyGvb0LOD8AJ1zuPHz2QuDIY00IWHBqR7S/n\nQBxrDQCIsNfbnW51uyI6bGT1UvZ7ctmcGqex/GEo9naBod+GZU9CZRSXPw1Dpr+Co2tWJq5JKaBj\nPxgxFZY+ARUtv3/FmESw4NCILH85FfEODsAOb296+raHf4AqI6qX8Xn6KFSS7O088QaoKYclj8X1\ntCOql5JCHQw6J67nDemkm5zhtB//JdElMSYiSfZpkjyy/eVUSAKCQ0pfevq2IVoXVvojfJvo6C/m\nsyRqUqrXawQMOB0WPuSsqRAno6sWUS4doO/YuJ2zUd0GOyvFffxXuynOtCkWHBqRrYmpOWxP6Uca\ntXQLs99hRPVSAD5LHx3LYrXciTdA+S747Lm4nE7Uz8jqJXyaUZg860qc8Svw+2D+nYkuiTFhs+DQ\niOwENSttT3E6UHv7wlupZ3TVIr5MyafY2zWWxWq5o06DniPgwz/H5aa4o2rX0dFfwrL0cc0njpfO\n/eG478PyZ2H78kSXxpiwWHBoRKKalbanOEMee/u2Nps2p66EY2pWsiQjvgv7REQETrrRmTb7i9di\nfrrCqo+ow5N8zWyn/ASyusC8W6DOl+jSGNOssOrdIjIe+CPgBf6uqjMb7E8HngTGAHuBqaq62d13\nK3AVUAfcoKqvi0g/N30PQIFHVPWPbvrbgWuAwG3CP3OXKY0bUT/ZWkFFHCfdCyjz5lEmOfQKIziM\nrl6EBz+LM5Jz+ubA/QIe7cn93h7s/9evoev9sVvHWZXjK99nVdoIyrx5EZUxUhFP/Z2RB+N/B/++\nBhbcB6fe0qLztojfD+U7oa4GxAM5veub3Gw6cNOYZoODiHiBB4GzgK3AYhGZq6qrgpJdBRSr6kAR\nmQbcDUwVkSHANGAo0Bt4S0QGAz7gx6q6TERygKUi8mZQnvep6r3RushIZWglHvxxvTs62LbUIziy\ndlOz6cZWfUiRtzubUwfGoVQt5xcvL3WYyjWlf2JE9TI+y4jNt/p+vs30qtvGKx0uiEn+rTbiO85s\nre/+DgZ801l3OhZUYdtSWPsabJgPRWucNbQDvOnQYwgc/S261B3NXvfOfGOChVNzGAesV9WNACIy\nG5gMBAeHycDt7vM5wAMiIu722apaDWwSkfXAOFX9CNgBoKplIrIa6NMgz4T5euqM+DcrAWxIHcxZ\nFa/iVR91EvotSvdXMaJqGW9nnxu7b+JR9N+sM7mg7FkuLHvG6TyPQZmPr3wfP57kbmabcC98tRD+\n+V24+i3I6RG9vGsOwOfPw8KHYfcqEC/0Ow7GTHfuUk/Nclao2/OFEzze+Q1/Rng/8wxm537XuTfF\nGFc4waEPENw7uhU4rrE0quoTkVKgi7v94wbH9gk+UETygVHAwqDN14vIFcASnBrGIcujici1wLUA\nRxxxRBiXEb5sdYNDHBf6CbY+7Wi+VfEC/XybG60VjKheSho1LE7mD8IgPknjpZzv8L3SvzC05lNW\nphdE/RzHVS1gddowSr3xXT87IpkdYeqT8PgEeOZCuGIuZHVuXZ4lXzl3oi99AqpKoOdwmPRnZyW6\nptYSL97Mq3+/g/EVczmu6n2eyb2aN7Mmtq4spt1IaIe0iHQA/gXcpKr73c1/BQYABTi1i9+HOlZV\nH1HVQlUt7NYtutXiREy6F2xD6tEADKhZ22ia46oWUCY5CVv1rSXeyRrPPk9nLih7Nup596n9kr6+\nr1iYGefpuVui9yiY+hQUfQGPn+uscx0pVWe9iucugz+OhA8fgKNOhe++Bte97yxX2lRgAOiUzzN5\n1/Dj7o+wJm0YV5U+yI3Fv4Wq/U0fZw4L4QSHbUDwrGF93W0h04hICpCH0zHd6LEikooTGJ5R1X8H\nEqjqLlWtU1U/8DecZq24SnSz0m5vT/Z7chnYSHDI9FcwtupDPso8Fb9441y6lquVNF7u8B2G1nzG\nMdWfRzXvkyrfxY+wKOOkqOYbMwPPhMvmQNlOePhU5y7yMEYx5dUVM7H8n/DgOJg1ATYvcEaD3fgp\nfOdJOPLEiJvsdqf04u7Od/JszvcYV/WBE7Dshr3DXjjBYTEwSET6i0gaTgfz3AZp5gJXus+nAPNV\nVd3t00QkXUT6A4OARW5/xKPAalX9Q3BGItIr6OW3gRWRXlRr5fidb07lkpiaAyKsTRvK8JpPQi4W\nc3zle6RrNf/NivMKZ1HwdtZ4SjydmFIWvYVwROs49cCbfJY+hpK21G7e/xS47r/QayS8cjM8MAbm\n3wXr3oLSrVC2C/ZtYkTVEs4vm81te27hL7su5bL9j0JmZ5j8IPxoNZx5e6tnfVXxMDfnO9zd+U4o\n3gyPng171kfjKk0b1Wyfg9uHcD3wOs5Q1sdUdaWI3AEsUdW5OB/0T7kdzvtwAghuuudxOpp9wA9V\ntU5ETgYuBz4XkcBdQYEhq/8nIgU4Q1w3A9dF8XrDkud3ujj2ezvG+9T1lmYcz9iqj8j3bTi430GV\nsw+8wpaUI9iQOjhh5WupGk8GL3WYypX7H2JYzSesiMKd3SOrl9HFv4cnsw7+U4nX9OCRnOuQYaKd\n8uHKl2HNq840I+/dg/On/7WfuY+bUgbwcoeLeC/zTLbX9XO+ti1eHjrfRsrU3DDVzzLGwJRX4Okp\n8MRE+O486HxUWNdm2pew7nNwP7TnNdh2W9DzKuCiRo69C7irwbYFQMi6r6peHk6ZYinPX0KFZFMr\naQkrw7L04/AjFFZ+dFBwGFrzKf1rN/Bw3o1tYpRSKG9mT2BCxb+Ztn8Wv+g6qtXXcdqB19nvyWNJ\nxvFRKmGcicCxE52fqv2wY7nTD+H3gTed2z+oYltKv7Dv3Wi13qOcgDXrW/DEJCdAdIzuoA+T/OwO\n6RDy6oop9SSu1gBOrWVN2jC+Ufk2XnXaokX9XFT2FCWeTizIOiOh5WsNn6QxJ+cyBtZ+wdiqD1qV\nV05dCYVVH/N+5unUSWqUSphAGblOc9OY6TD2ahh9OWvSh8UvMAT0GAKXvwDV++GJ82B/BDMFm3bB\ngkMIef6SpBgO+XKHKfSo28lpB94A4PQDr3FMzUpm505PaK0mGt7PPIOtKUdwyf7H8Wpti/M5tfIt\nUvDxTlYSTM/d3vQugMtegIq98OT5zqM5bFhwCCHPn/iaA8An6eNYmzqEK0sf4n+K7+Wq0gf5PK2A\n/2a2vY7ohvzi5anca+lVt40J5S+2KA+v+hhf8RKr0oazNTU/ugU0jr5j4JLZznrcz1wI1WWJLpGJ\nEwsOIeTVlVDqSXzNARHu7Xwba9KGclzVAhZlnMi9nW9PvkV9WujTjEKWZBzPBeXP0qku8m+lJ1a+\nS9e6Il7uMCUGpTP18k+Gi2bBjs9g9iVxXZvDJE77+JSJIq/W0kHLKU3gSKVgZd6O/Lbr75je60Xu\n7/wLqj0ZiS5SVD2Vey1e9XHZ/kciOs6rPi4se4bNKUexPD0JFvVp744+F87/K2x6D/51lc0sexiw\n4NBAnt9Z7zgZmpUOB7tSevNizjROqvwvJx54J+zjTj/wGj3rdvBc7pXtpiaV9EZOhfF3w5pX4OUb\no3afiklOSbJUVvLIqwsEhyRoVjpMvNhhGiOrlnJV6QN8kTaEPSlNT0aXV1fM1P1PsCJtJJ8k06I+\nYQhnqu+W3J8R7jHhpGs6zUimdLiUKcuf5pV1lTyde3XMh1TbFOKJYV+5GgjcAJcszUqHA794eaDT\n/0NQbij+Hala3WhaUT/XlNxPulbzaMfr2+y9Hm3ZnJzL+E/2JCZW/IvJ5fFZ/tXEnwWHBjrV7QOg\nxNPKmTJNRIpSevJQxx8xsHYtN+77LalaEzLdlLKnKaxeyDO5V7EjpXVTRpgWEuGJ3O/zfuY3ubhs\nFmdUvJroEpkYsODQQM+67fhIsQVQEmBR5sk8nvdDCqsX8os9M+jh+/rGqxSt4fLSh7mw/FneyTyb\n/2RPTmBJjYqHhzr+mGXp47iq9IGI+otM22B9Dg309G1jV0rPNjXbaXvyZvZEyjy5XFtyP3/YfTUr\n0wso8+QwtPozOvqL2xB47wAACEZJREFU+U/2JJ7Ivc6ak5JAnaRwX+efc+veX3B9yf+RpQd4K/tb\niS6WiRILDg308m1jh7dP8wlNzHyceQpr04ZwbvmLDK/+hO6+HXyRdiyvZ0+KySJBpuVqJZ2Zne/k\nxuLfcXXpn+lYt485OZdZ8G4HLDgEEfXT07fdWcbSJFSxtyvP5l2d6GKYMNR4Mvh959u4puSPTCl/\nhs7+PTye98M2P8XL4c6CQ5DO/r2kUcOOFKs5mPiI57TiseQXLw93vJlibxcuKP8HR9Zu5P5OP6co\npWer827J1OPRPl9z2uNwW+uQDtLLtxWAnRYcjImcCM/nXsm9nW6jl28bdxf9gG9W/MdulmujLDgE\nOaLWWct3uw2RNKbFlmSeyIxuD7I5dQDXld7Pz/feWv+/ZdoOCw5BCqqWsDXlCIrb0lKTxiSh3Sm9\nuLPL3Tyadz35tRuYWfRDflB8D/1qNyW6aCZM1ufgyvAfYEjN57xm4+eNiQoVD29mT+TDzFM5v2w2\nZx14hVMq3+bztALeyzqTxRknUuXJSnQxTSPCqjmIyHgRWSsi60VkRoj96SLynLt/oYjkB+271d2+\nVkTOaS5PEenv5rHezTMuQx7GVC0kBR+fZLStuXqMSXYVnhyeybuGH/Z4mtk50+lRt4MfltzL33ZO\n5Zd7/h/fLnuWo6tXkOmvSHRRTZBmaw4i4gUeBM4CtgKLRWSuqq4KSnYVUKyqA0VkGnA3MFVEhgDT\ngKFAb+AtERnsHtNYnncD96nqbBF5yM37r9G42JBUOcK3iSv2P8RXKfmsTRsas1MZczir8OTwYs40\nXuwwlcE1qxhb9SHDapZzUdlTeHA6rYu83dme0pd93q4Ue7pQ7O1CiacjlZ4sqiSTKsmkWjKgvAi8\nKSBe8KSAx+s+99o9FlESTrPSOP5/e+cXYkUdxfHP139rpeS/EEsJDSEMwkTKQHwoiPRlC3qwHvQh\nEEqhHoIMQSyKKCookqRQMIvMrMiXKCuhl9Ss1lXb1C03UkzJUpOgdtfTw++s3d175+69m+vccc8H\nhvnNmbm/OWfPvffc+c1vvwPtZvYTgKTNQDNQWhyagTXe3gq8Kklu32xmfwNHJLV7f1TqU1IbcAfw\ngB+z0fsdnOLw1VreOr6aEXTxl67k5fFP0K0YaQuCQUXiUNNNHGpKP8TGdp9hZucPTO3sYFpXB9d2\nHWVa58+MO/8HwzhfuY8XqvU/LBUMMopEZvFI9o3dvc+ZPdeqpJ9nShQVLnVxuvtZmLPkondbyzfh\ndcAvJdtHgduyjjGzLklngIlu39nntT3zRCv1ORE4bWZdFY7vhaRlwDLfPCfpYA2xVGIS8BucBe4f\nYBcNg8dyWRCxNCYRS6OxaimwdKCxXJ+1o7A/k83sdaC+x4dVQNIeM5t7EVzKnYilMYlYGpOIpTq1\n3JA+BpRO/J/qtorHSBoBXA2cqvLaLPspYJz3kXWuIAiCYJCppTh8Dcz0WUSjSDeYt/U5Zhuw1Nv3\nAV+Ymbl9sc9mmg7MBHZn9emv2eF94H1+NPDwgiAIgoHQ77CS30NYAXwCDAc2mNkBSU8Be8xsG7Ae\n2OQ3nH8nfdnjx20h3bzuApabWTdApT79lI8DmyU9DXznfQ8m/3toqoGIWBqTiKUxiViqIAvdkyAI\ngqAPIZ8RBEEQlBHFIQiCIChjSBeH/mRBGh1JHZL2SWqRtMdtEyRtl3TY1+Pz9rMSkjZIOilpf4mt\nou9KvOJ5apXUUE9jyohljaRjnpsWSYtK9lWUlMkbSdMk7ZD0vaQDkh5xe+HyUiWWIuZltKTdkvZ6\nLE+6vaLUkKrIGdWFmQ3JhXQj/EdgBjAK2AvMytuvOmPoACb1sT0PrPT2SuC5vP3M8H0BMAfY35/v\nwCLgY9K/pM4DduXtfw2xrAEeq3DsLH+vNQHT/T04PO8Y3LcpwBxvjwUOub+Fy0uVWIqYFwFjvD0S\n2OV/7y3AYrevAx7y9sPAOm8vBt4dyHmH8pXDBVkQM/sH6JEFKTrNJNkRfH1Pjr5kYmZfkma2lZLl\nezPwpiV2kv4XZsql8bR/MmLJ4oKkjJkdAUolZXLFzI6b2bfe/hNoIykUFC4vVWLJopHzYmZ2zjdH\n+mIkqaGtbu+bl558bQXudDmjuhjKxaGSLEjRHgFnwKeSvnE5EYDJZnbc278Ck/NxbUBk+V7UXK3w\n4ZYNJcN7hYjFhyJuIf1KLXRe+sQCBcyLpOGSWoCTwHbSlU2W1FAvOSOgR86oLoZycbgcmG9mc4CF\nwHJJC0p3WrquLORc5SL77rwG3ADMBo4DL+brTu1IGgO8DzxqZmdL9xUtLxViKWRezKzbzGaTVCNu\nBW4c7HMO5eJQiyxIQ2Nmx3x9EviQ9KY50XNp7+uT+XlYN1m+Fy5XZnbCP9DngTf4b4iioWORNJL0\nZfq2mX3g5kLmpVIsRc1LD2Z2mqQicTvZUkNZckZ1MZSLQy2yIA2LpKskje1pA3cB++ktZVI0+ZEs\n37cBS3x2zDzgTMkwR0PSZ+z9XlJuIFtSJnd8XHo90GZmL5XsKlxesmIpaF6ukTTO21eQnoPTRrbU\nUJacUX3kfSc+z4U02+IQafxuVd7+1On7DNLsir3AgR7/SWOLnwOHgc+ACXn7muH/O6TL+k7SeOmD\nWb6TZmus9TztA+bm7X8NsWxyX1v9wzql5PhVHstBYGHe/pf4NZ80ZNQKtPiyqIh5qRJLEfNyM0lK\nqJVUzFa7fQapgLUD7wFNbh/t2+2+f8ZAzhvyGUEQBEEZQ3lYKQiCIMggikMQBEFQRhSHIAiCoIwo\nDkEQBEEZURyCIAiCMqI4BEEQBGVEcQiCIAjK+Bd8b7gayoEn1AAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gjn4x2JqBfll",
        "colab_type": "text"
      },
      "source": [
        "The above plot is the mixture density of the Bayes estimators of the cluster parameters, weighted by their corresponding weights. As in the Gaussian example, we have taken the Bayes estimators of each cluster parameter and their corresponding weights by computing the posterior means of `lambda` and `beta` respectively."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NaHLTiRJUxBR",
        "colab_type": "text"
      },
      "source": [
        "### ELBO Behavior\n",
        "\n",
        "Below are plots of the behavior of the loss function (negative Trace_ELBO) over the SVI iterations during inference using Pyro, as well as a plot of the autocorrelations of the ELBO 'time series' versus iteration number. We can see that around 500 iterations, the loss stops decreasing significantly, so we can assume it takes around 500 iterations to achieve convergence. The autocorrelation plot reaches an autocorrelation very close to 0 around a lag of 500, further corroborating this hypothesis. Note that these are heuristics and do not necessarily imply convergence."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XzbxzSkOUveF",
        "colab_type": "code",
        "outputId": "a752e5e8-1fcf-4ff9-d8db-8d3f59a6a32b",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 369
        }
      },
      "source": [
        "elbo_plot = plt.figure(figsize=(15, 5))\n",
        "\n",
        "elbo_ax = elbo_plot.add_subplot(1, 2, 1)\n",
        "elbo_ax.set_title(\"ELBO Value vs. Iteration Number for Pyro BBVI on Sunspot Data\")\n",
        "elbo_ax.set_ylabel(\"ELBO\")\n",
        "elbo_ax.set_xlabel(\"Iteration Number\")\n",
        "elbo_ax.plot(np.arange(n_iter), losses)\n",
        "\n",
        "autocorr_ax = elbo_plot.add_subplot(1, 2, 2)\n",
        "autocorr_ax.acorr(np.asarray(losses), detrend=lambda x: x - x.mean(), maxlags=750, usevlines=False, marker=',')\n",
        "autocorr_ax.set_xlim(0, 500)\n",
        "autocorr_ax.axhline(0, ls=\"--\", c=\"k\", lw=1)\n",
        "autocorr_ax.set_title(\"Autocorrelation of ELBO vs. Lag for Pyro BBVI on Sunspot Data\")\n",
        "autocorr_ax.set_xlabel(\"Lag\")\n",
        "autocorr_ax.set_ylabel(\"Autocorrelation\")\n",
        "elbo_plot.tight_layout()\n",
        "elbo_plot.show()\n"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nJtbtPsIZHRNZtzuj1JdwgGFdmvLMVb2LrXID0Lt1Ai/+tB9b92exPf0o//hqI8+N78v7C7fxz683\nk1/4w++/Mzom0q5JLIey8pi6fCfgm+LUNC6StbszyjxnI05rxtx1eyuc/LZXcjzLgmCaU3UtPRxI\nAQwREREpjwIYFaSbEhGpy5xzpO45QufmDap8rKnLdnJaywZ0aFrxpJEb9h6hoNDRpRLt2H8kh7DQ\nEOKjwykodPxl1jqu6J9M28RYnHP8fc4GeiXHM+nLjUSHhzLJy/Uwe81utu7P4vL+yew8mE2nZnFl\nrrQCvvwwB7JyWbPzMJm5BVzcqyVmhnOOZdsP0StgSdsVaYdoER/FdxsPMKxrU7bszyQiNKTUZ7zj\n4FHSs3IpKHQ8N2s9Vw1szeD2jfls5W66tWxAQnQE8THhNIwKI+3gUZyDQueYsmQHSQnRdGwWR8rm\nAwxq35jo8FD2HskhM6eAfUdyGDegNQeycnk3ZRsdmsSxPzOHy/v6Eu8uTzvEhsfGsPtwNuc89QWv\n3DCQxjERTPxwOWEhxqKtBxnbqyWje7Sgd3ICC7eks+9IDjed3aHC5+Z4FMAQERGR8iiAUUG6KRER\nkbriUFYeh47mHTPxKEBmTj7R4aGnZMUWBTBERESkPFW9VwirzsaIiIjIqRMfE058TPl5LGIj9ate\nRERE6obKZd0TERERERERETmFFMAQERERERERkaCnAIaIiIiIiIiIBD0FMEREREREREQk6CmAISIi\nIiIiIiJBTwEMEREREREREQl6CmCIiIiIiIiISNBTAENEREREREREgp4CGCIiIiIiIiIS9BTAEBER\nEREREZGgpwCGiIiIiIiIiAQ9c87VdBtOKTPbC2yp5sM2AfZV8zGDTX3oI9SPftaHPkL96Gd96CPU\nj37WlT62dc41relGVJWZZQBra7od9VRd+b9Q2+hzrzn67GuOPvua0dU516CyLw6rzpbUBifjxsrM\nUpxzA6r7uMGkPvQR6kc/60MfoX70sz70EepHP+tDH2uZtTofNUP/F2qGPveao8++5uizrxlmllKV\n12sKiYiIiIiIiIgEPQUwRERERERERCToKYBRPSbVdANOgfrQR6gf/awPfYT60c/60EeoH/2sD32s\nTXQ+ao4++5qhz73m6LOvOfrsa0aVPvd6l8RTRERERERERGofjcAQERERERERkaCnAIaIiIiIiIiI\nBD0FMKrIzEab2VozSzWze2u6PZVlZq3N7AszW2VmK83sDq+8sZnNNLP13r+NvHIzs796/V5mZv1q\ntgcnzsxCzWyxmX3ibbc3s++8vkw2swivPNLbTvX2t6vJdleEmSWY2ftmtsbMVpvZ0Lp2Ls3sLu9n\ndYWZvW1mUXXx/HnsAAAKyElEQVThXJrZq2a2x8xWBJRV+NyZ2fVe/fVmdn1N9OVYjtHHp72f12Vm\n9l8zSwjYd5/Xx7VmdkFAedBef8vqY8C+35iZM7Mm3natPI91UTD/TNUF1XV9k4qzenSfF0y8e5Pv\nzWyp97n/0Suv9fcrtYXVg/v+YGRmm81suZktMW/Z1Oq63iiAUQVmFgr8DbgQ6A78xMy612yrKi0f\n+I1zrjswBLjV68u9wOfOuc7A5942+Prc2XtMAF449U2utDuA1QHbTwLPOuc6AenAjV75jUC6V/6s\nV6+2eA741DnXDeiNr7915lyaWSvg18AA51wPIBQYT904l68Bo0uUVejcmVlj4CFgMDAIeKjol0SQ\neI3SfZwJ9HDO9QLWAfcBeNeh8cDp3mv+7t2MBPv19zVK9xEzaw2MArYGFNfW81in1IKfqbrgNap4\nfZNKq0/3ecEkBzjPOdcb6AOMNrMh1I37ldqiPtz3B6tznXN9nHMDvO1qud4ogFE1g4BU59xG51wu\n8A5waQ23qVKcczudc4u85xn4/qO3wtef171qrwOXec8vBd5wPt8CCWbW8hQ3u8LMLBm4CHjZ2zbg\nPOB9r0rJPhb1/X3gfK9+UDOzeOAc4BUA51yuc+4gdexcAmFAtJmFATHATurAuXTOfQkcKFFc0XN3\nATDTOXfAOZeOLzhQ6st0TSmrj865z5xz+d7mt0Cy9/xS4B3nXI5zbhOQiu/aG9TX32OcR/DdFN0D\nBGbQrpXnsQ4K6p+puqCarm9SCfXlPi/YeJ/fEW8z3Hs46sD9Sm1QH+77a5lqud4ogFE1rYBtAdvb\nvbJazRsy1Rf4DmjunNvp7doFNPee19a+/wXfl4dCbzsROBjwxSmwH/4+evsPefWDXXtgL/BPb8jc\ny2YWSx06l865NOB/8f0Veye+c7OQuncui1T03NW6c1rCz4Hp3vM600czuxRIc84tLbGrzvSxltPn\nXTPqzO+m2qKO3+cFHW/U4BJgD75A9Abq7v1KsKkP9/3BygGfmdlCM5vglVXL9UYBDCnGzOKA/wB3\nOucOB+5zvjV3a+26u2Y2FtjjnFtY0205ycKAfsALzrm+QCY/DNEC6sS5bIQvWtseSAJiqSd/ma7t\n5+54zGwivqHOb9V0W6qTmcUA9wMP1nRbRIJVXb++BYO6fJ8XrJxzBc65PvhGFg4CutVwk+qFenTf\nH6zOcs71wzc95FYzOydwZ1WuNwpgVE0a0DpgO9krq5XMLBzfL7W3nHMfeMW7i4bweP/u8cprY9/P\nBC4xs834hgafhy9XRII3DQGK98PfR29/PLD/VDa4krYD251z33nb7+MLaNSlczkC2OSc2+ucywM+\nwHd+69q5LFLRc1cbzylmdgMwFrjG+8UGdaePHfEF3JZ616BkYJGZtaDu9LG20+ddM+rS76agVg/u\n84KaN533C2Aodfd+JZjUl/v+oOSNlsY5twf4L77gXbVcbxTAqJoFQGcvm20EvkRzU2q4TZXizfF6\nBVjtnHsmYNcUoCjz/fXARwHl13lZY4cAhwKGBAUl59x9zrlk51w7fOdqtnPuGny/TK7wqpXsY1Hf\nr/DqB/1fJpxzu4BtZtbVKzofWEUdOpf4po4MMbMY72e3qI916lwGqOi5mwGMMrNG3miVUV5Z0DKz\n0fiGeV7inMsK2DUFGG++7ODt8SV4+p5adv11zi13zjVzzrXzrkHbgX7e/9c6cx5ruVr1M1WH1KXf\nTUGrPtznBSMza2reqlpmFg2MxJd/pK7erwSN+nLfH4zMLNbMGhQ9x3f/soLqut445/SowgMYgy9j\n/gZgYk23pwr9OAvfMJ5lwBLvMQbf3K/PgfXALKCxV9/wZWvfACzHtxpEjfejAv0dDnziPe+A7wtR\nKvAeEOmVR3nbqd7+DjXd7gr0rw+Q4p3PD4FGde1cAn8E1ngXxDeByLpwLoG38eX1yMP3JffGypw7\nfHkkUr3Hz2q6XyfQx1R88x+Lrj8vBtSf6PVxLXBhQHnQXn/L6mOJ/ZuBJrX5PNbFRzD/TNWFR3Vd\n3/So1Gdfr+7zguUB9AIWe5/7CuBBr7zW36/Upgd1/L4/2B7eZ7zUe6ws+n1aXdcb814kIiIiIiIi\nIhK0NIVERERERERERIKeAhgiIiIiIiIiEvQUwBARERERERGRoKcAhoiIiIiIiIgEPQUwRERERERE\nRCToKYAhUk+Z2RHv33ZmdnU1H/v+EtvfVNNxXzOzNDOL9LabmNnmajr2cDP7pDqOJSIiItWn6J5F\nREQBDBFpB1QogGFmYcepUiyA4Zw7o4JtKk8B8PNqPF61MLPQmm6DiIiIiEhdpgCGiDwBnG1mS8zs\nLjMLNbOnzWyBmS0zs1+Cf4TCV2Y2BVjllX1oZgvNbKWZTfDKngCiveO95ZUVjfYw79grzGy5mY0L\nOPYcM3vfzNaY2VtmZsdo71+Au0oGUUqOoDCz583sBu/5ZjN73GtTipn1M7MZZrbBzG4OOExDM5tq\nZmvN7EUzC/FeP8rM5pvZIjN7z8ziAo77pJktAq6sykkQERGRE2dmF5vZd2a22MxmmVlzr7ypmc30\n7k1eNrMtZtakptsrItVDAQwRuRf4yjnXxzn3LHAjcMg5NxAYCPzCzNp7dfsBdzjnunjbP3fO9QcG\nAL82s0Tn3L3AUe9415R4r8uBPkBvYATwtJm19Pb1Be4EugMdgDOP0d6twDzg2gr2c6tzrg/wFfAa\ncAUwBPhjQJ1BwO1eGzoCl3s3PQ8AI5xz/YAU4O6A1+x3zvVzzr1TwfaIiIhI5c0Dhjjn+gLvAPd4\n5Q8Bs51zpwPvA21qqH0ichIcbxi4iNQ/o4BeZnaFtx0PdAZyge+dc5sC6v7azH7kPW/t1dtfzrHP\nAt52zhUAu81sLr4gyWHv2NsBzGwJvqkt845xnMeBj4CpFejXFO/f5UCccy4DyDCzHDNL8PZ975zb\n6LXhba+92fgCGl97g0IigPkBx51cgTaIiIhI9UgGJnt/CIkAiu5PzgJ+BOCc+9TM0muofSJyEiiA\nISIlGXC7c25GsUKz4UBmie0RwFDnXJaZzQGiqvC+OQHPCyjn+uScW+8FOa4KKM6n+Kiykm0pOn5h\nifcqDHgvV/Kt8H0eM51zPzlGczKPUS4iIiInz/8Bzzjnpnj3JA/XbHNE5FTQFBIRyQAaBGzPAG4x\ns3AAM+tiZrFlvC4eSPeCF93wTccoklf0+hK+AsZ5eTaaAucA31ey3f8D/DZgewvQ3cwivREV51fi\nmIPMrL2X+2IcvhEg3wJnmlknADOLNbMu5R1ERERETrp4IM17fn1A+dd4f+Aws1FAo1PcLhE5iRTA\nEJFlQIGZLTWzu4CX8SXpXGRmK4CXKHs0xKdAmJmtxpcI9NuAfZOAZUVJPAP813u/pcBs4B7n3K7K\nNNo5txJYFLC9DXgXWOH9u7gSh10APA+sxjcU9b/Oub3ADcDbZrYM3/SRbpVps4iIiFRKjJltD3jc\njW/ExXtmthDYF1D3j8Ao7x7mSmAXvj/WiEgdYM6VHDEtIiIiIiJS+5hZJFDgnMs3s6HAC14SbxGp\nA5QDQ0RERERE6oo2wLvedNBc4Bc13B4RqUYagSEiIiIiIiIiQU85MEREREREREQk6CmAISIiIiIi\nIiJBTwEMEREREREREQl6CmCIiIiIiIiISNBTAENEREREREREgt7/A8b4vnxDBSDPAAAAAElFTkSu\nQmCC\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_sn3OS8tOoko",
        "colab_type": "text"
      },
      "source": [
        "# **Criticism**\n",
        "\n",
        "---\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qvRAgapHZLPA",
        "colab_type": "text"
      },
      "source": [
        "## Long-Term Sunspot Model\n",
        "\n",
        "Since we computed the approximate posterior of the DPMM that was fit to the long-term sunspot data, we can utilize some intrinsic metrics, such as the log predictive, posterior dispersion indices, and posterior predictive checks. \n",
        "\n",
        "Since the posterior predictive distribution for a Dirichlet process mixture model is itself a scale-mixture distribution that has an analytic approximation [(Blei and Jordan, 2004)](http://www.cs.columbia.edu/~blei/papers/BleiJordan2004.pdf), this makes it particularly amenable to the aforementioned metrics:\n",
        "\n",
        "$$p(x_{new} | X_{1:N}, \\alpha, G_0) \\approx \\sum_{t=1}^T \\mathbb{E}_q [\\pi_t(\\beta)] \\ \\mathbb{E}_q \\left[p(x_{new} | \\theta_t)\\right].$$\n",
        "\n",
        "In particular, to compute the log predictive, we first compute the posterior predictive distribution (defined above) after performing variational inference on our model using a training subsample of our data. The log predictive is then the log value of the predictive density evaluated at each point in the test subsample:\n",
        "\n",
        "$$\\log p(x_{new} | X) = \\log \\mathbb{E}_{\\beta, \\theta | X} \\left[ p(x_{new} | \\beta, \\theta) \\right]$$\n",
        "\n",
        "Since both the training samples and the testing samples were taken from the same dataset, we would expect the model to assign high probability to the test samples, despite not having seen them during inference. This gives a metric by which to select values of $T$, $\\alpha$, and $G_0$, our hyperparameters: we would want to choose the values that maximize this value.\n",
        "\n",
        "We perform this process below with varying values of $\\alpha$ to see what the optimal setting is."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3V2-DC9nobPi",
        "colab_type": "code",
        "outputId": "473035e6-036f-4e34-9ea4-6c2dc5a4bec0",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 526
        }
      },
      "source": [
        "# Hold out 10% of our original data to test upon\n",
        "df_test = df.sample(frac=0.1)\n",
        "data = torch.tensor(df.drop(df_test.index)['sunspot.year'].values, dtype=torch.float)\n",
        "data_test = torch.tensor(df_test['sunspot.year'].values, dtype=torch.float)\n",
        "N = data.shape[0]\n",
        "N_test = data_test.shape[0]\n",
        "\n",
        "alphas = [0.05, 0.1, 0.5, 0.75, 0.9, 1., 1.25, 1.5, 2, 2.5, 3]\n",
        "log_predictives = []\n",
        "\n",
        "for val in alphas:\n",
        "    alpha = val\n",
        "    T = 20\n",
        "    svi = SVI(model, guide, optim, loss=Trace_ELBO())\n",
        "    train(500)\n",
        "    \n",
        "    S = 100 # number of Monte Carlo samples to use in posterior predictive computations\n",
        "\n",
        "    # Using pyro's built in posterior predictive class:\n",
        "    posterior = Predictive(guide, num_samples=S, return_sites=[\"beta\", \"lambda\"])(data)\n",
        "    post_pred_weights = mix_weights(posterior[\"beta\"])\n",
        "    post_pred_clusters = posterior[\"lambda\"]\n",
        "\n",
        "    # log_prob shape = N_test x S\n",
        "    log_prob = (post_pred_weights.log() + Poisson(post_pred_clusters).log_prob(data.reshape(-1, 1, 1))).logsumexp(-1)\n",
        "    mean_log_prob = log_prob.logsumexp(-1) - np.log(S)\n",
        "    log_posterior_predictive = mean_log_prob.sum(-1)\n",
        "    log_predictives.append(log_posterior_predictive)\n",
        "\n",
        "plt.figure(figsize=(10, 5))\n",
        "plt.plot(alphas, log_predictives)\n",
        "plt.title(\"Value of the Log Predictive at Varying Alpha\")\n",
        "plt.show()"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "100%|██████████| 500/500 [00:03<00:00, 163.51it/s]\n",
            "100%|██████████| 500/500 [00:03<00:00, 164.64it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 169.77it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 170.06it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 171.63it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 173.58it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 173.57it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 175.42it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 176.11it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 175.92it/s]\n",
            "100%|██████████| 500/500 [00:02<00:00, 175.63it/s]\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x360 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "PGw4eD363PWP",
        "colab_type": "text"
      },
      "source": [
        "From the above plot, we would surmise that we want to set $\\alpha > 1$, though the signal is not quite clear. A more comprehensive model criticism process would involve performing a grid search across all hyperparameters in order to find the one that maximizes the log predictive.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8A1gt4sn8Upo",
        "colab_type": "text"
      },
      "source": [
        "# References\n",
        "\n",
        "\n",
        "\n",
        "1.   Ferguson, Thomas. *A Bayesian Analysis of Some Nonparametric Problems*. The Annals of Statistics, Vol. 1, No. 2 (1973). \n",
        "2.   Aldous, D. *Exchangeability and Related Topics*. Ecole diete de Probabilities Saint Flour (1985).\n",
        "3.   Sethuraman, J. *A Constructive Definition of Dirichlet Priors*. Statistica, Sinica, 4:639-650 (1994).\n",
        "4.   Blei, David and Jordan, Michael. *Variational Inference for Dirichlet Process Mixtures*. Bayesian Analysis, Vol. 1, No. 1 (2004).\n",
        "5.   Pedregosa, et al. *Scikit-Learn: Machine Learning in Python*. JMLR 12, pp. 2825-2830 (2011).\n",
        "6.   Bishop, Christopher. *Pattern Recogition and Machine Learning*. Springer Ltd (2006).\n",
        "7.   *Sunspot Index and Long-Term Solar Observations*. WDC-SILSO, Royal Observatory of Belgium, Brussels (2018).\n",
        "9.   Gelman, Andrew. *Understanding predictive information criteria for Bayesian models*. Statistics and Computing, Springer Link, 2014.\n",
        "\n",
        "\n",
        "\n"
      ]
    }
  ]
}
